【问题标题】:JAVA XML : get content NodeJAVA XML:获取内容节点
【发布时间】:2025-12-26 08:10:06
【问题描述】:

我有一个这样的 xml:

<root>
   <countries>
      <country id="98" nom="Espagne"/>
      <country id="76" nom="France"/>
   </countries>
</root>

我可以用这个来读取根标签内的内容:

Document doc = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder().parse(XmlFile);

System.out.println("Root element :" + doc.getDocumentElement().getNodeName());      

Node NodeCountries = doc.getElementsByTagName("countries").item(0);     

System.out.println(nodeToString(NodeCountries));


private static String nodeToString(Node node) throws Exception{
            StringWriter sw = new StringWriter();

              Transformer t = TransformerFactory.newInstance().newTransformer();
              t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
              t.setOutputProperty(OutputKeys.INDENT, "yes");
              t.transform(new DOMSource(node), new StreamResult(sw));

            return sw.toString();
          }

但是我不能像这样在国家标签中获取所有内容:

<country id="98" nom="Espagne"/>
<country id="76" nom="France"/>

【问题讨论】:

  • @andrewjames,对不起,它和我想要的不一样
  • 啊,抱歉 - 现在我明白了 - 您希望将整个内部 XML 作为字符串。在这个问题中讨论了这一点:Java DOM 中的Get a node's inner XML as String。我希望这确实有帮助!有几个选项 - 但有些不推荐。
  • 我已经看过这个例子,输出和我上面写的一样。问题是返回的字符串有标签父国家,我只需要里面的内部XML
  • 我已经更新了我的示例。它产生我认为你需要的东西。看看吧!

标签: java xml w3c


【解决方案1】:

以下示例将打印&lt;country id="98" nom="Espagne"/&gt;&lt;country id="76" nom="France"/&gt;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.InputSource;
import java.io.StringReader;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ls.LSSerializer;

...

String xml = "<root><countries><country id=\"98\" nom=\"Espagne\"/><country id=\"76\" nom=\"France\"/></countries></root>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xml));
Document doc = builder.parse(is);
Node node = doc.getElementsByTagName("countries").item(0);
String innerXml = getInnerXml(node);
System.out.println(innerXml);

辅助方法 getInnerXml(node) 看起来像这样:

private String getInnerXml(Node node) {
    DOMImplementationLS lsImpl = (DOMImplementationLS) node.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
    LSSerializer lsSerializer = lsImpl.createLSSerializer();
    lsSerializer.getDomConfig().setParameter("xml-declaration", false);
    NodeList childNodes = node.getChildNodes();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < childNodes.getLength(); i++) {
        sb.append(lsSerializer.writeToString(childNodes.item(i)));
    }
    return sb.toString();
}

如果我误解了要求,请告诉我(再次!)。

这里的警告是这不是一个很好的解决方案。它涉及“手动”构建 XML(即字符串连接),并且如果输入意外不同或复杂,结果会很脆弱甚至损坏。

【讨论】:

  • 感谢您的响应,但我不需要属性的值。我需要这样的国家标签的所有内部html: