具有 NodeList 属性的 Java XML 字符串(解析)

Posted

技术标签:

【中文标题】具有 NodeList 属性的 Java XML 字符串(解析)【英文标题】:Java XML String with attributes to NodeList (parsing) 【发布时间】:2014-02-23 09:36:03 【问题描述】:

我有一个字符串,其内容是一个 XML 文档。

这是一个字符串的例子。

String xmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
"<Service oem=\"myOem\" agent=\"myAgent\" version=\"0.5.5.0\" build=\"30-01-2014-11-46\" />";

我想将此字符串转换为 NodeList。谷歌搜索导致了这个article。

我尝试了以下代码:

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xmlContent));
Document doc = db.parse(is);
NodeList oNodeService = doc.getElementsByTagName("Service");

问题是我在“db.parse(is)”行上遇到了问题。问题似乎是这个方法不支持 XML 属性。

错误信息是:

[Fatal Error] :1:70: Element type "Service" must be followed by either attribute specifications, ">" or "/>".
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 70; Element type "Service" must be followed by either attribute specifications, ">" or "/>".
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at PkgNetAccelerator32.MainEvents.ShowHtsInfo(MainEvents.java:1575)

我怎样才能成功地将这个 XML 字符串转换为 NodeList?

更新: 嗯,失败是特定于 XML 字符串的。我在上面给出了一个缩短的版本。我删除了所有不会导致崩溃的属性。

String xmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Service hostname=\"sarah-linux.localdomain\"uname=\"Linux sarah-linux.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux\" />";

如果我冒险猜测,我会说是句号或破折号。我想先得到这个更新。

【问题讨论】:

不,它确实会支持属性。你得到什么错误? 我添加了错误信息。 您提供的代码对我有用。请尝试制作一个简短但完整的程序来演示该问题。我的猜测是这不是您的实际 XML。 这里也一样。刚刚逐字测试了您的代码。 domain和uname之间不应该有空格吗:domain\"uname= 【参考方案1】:
    String xmlContent = "<System><rpm-items><rtmap-items><Rule-list><name>RoutingPolicy3</name></Rule-list></rtmap-items></rpm-items></System>";
    InputStream isr = new ByteArrayInputStream(xmlContent.getBytes(StandardCharsets.UTF_8));
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(isr);

    NodeList ruleList = doc.getElementsByTagName("System");

【讨论】:

仅代码的答案不被视为好的答案,请始终尝试添加解释 - 即使是总结

以上是关于具有 NodeList 属性的 Java XML 字符串(解析)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeList 遍历 XML 中的所有元素

从 NodeList 创建 Xml

带有xml DOM的Chrome getElementsByTagName()返回不正确的NodeList [重复]

如何在 Java 中使用 SAX Parser 检查 xml 标签是不是具有属性?

JSON转换为Java中具有类型属性的XML

XML使用DOM操作