java - 如何在不考虑 Java 命名空间名称的情况下从 XML 获取节点?

标签 java xml xml-parsing

我正在编写一个 java 程序,我在其中解析输入的 xml 文件,如下所示:

...
<ems:DeterminationRequest>
    <ems:MessageInformation>
       <ns17:MessageID xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">1000225404</ns17:MessageID>
       <ns17:MessageTimeStamp xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">2015-07-28T01:17:04</ns17:MessageTimeStamp>
       <ns17:SendingSystem xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">CH</ns17:SendingSystem>
       <ns17:ReceivingSystem xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">LD</ns17:ReceivingSystem>
       <ns17:ServicingFipsCountyCode xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">037</ns17:ServicingFipsCountyCode>
    </ems:MessageInformation>
</ems:DeterminationRequest>
...

现在我试图在不考虑命名空间名称“ems”的情况下获取节点“ems:MessageInformation”。所以我尝试了以下代码行:

Document doc = db.parse(new FileInputStream(new File("D:\\test.xml")));
Node element = doc.getDocumentElement().getElementsByTagNameNS("*","MessageInformation").item(0);
System.out.println(element.getNodeName());

但是它给出了空指针异常,因为函数没有读取所需的节点。我经历了这个 link以供引用。有人可以告诉我我在这里做错了什么吗?

最佳答案

这是

返回的 den NodeList 实现中的一个奇怪/有问题的行为

doc.getDocumentElement().getElementsByTagNameNS("*","MessageInformation")

它允许您访问 item(0) 返回一个空对象。 (如果您使用的是当前 JDK,NodeList 实现是 com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl,它会延迟加载其项并显示此错误行为)。


要防止 NullPointerException,您应该首先检查返回的 NodeList 的长度是否 > 0:

NodeList result = doc.getDocumentElement().getElementsByTagNameNS("*","MessageInformation");
if (result.getLength() > 0) {
    Node element = (Element)result.item(0);
    ...
}

然后你需要找出为什么 getElementsByTagNameNS 没有返回元素。

一个可能的原因可能是您在没有 namespace 支持的情况下解析文档。结果是 dom 元素没有命名空间信息,getElementsByTagNameNS 失败。

要打开命名空间支持,请使用:

DocumentBuilderFactory.setNamespaceAware(true);

或者,如果没有 namespace 支持,您可以搜索

NodeList nl = doc.getDocumentElement().getElementsByTagName("ems:MessageInformation");

关于java - 如何在不考虑 Java 命名空间名称的情况下从 XML 获取节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33496151/

相关文章:

Java:解密位置未知的凯撒密码

java - 错误索引超出长度限制在Java中意味着什么?

java - JPA多次返回同一个对象

xml - CDATA 的正则表达式是什么

java - 可恢复的 XML 解析

java - 从 url 保存 (xml) 文件的更好方法是什么?

java - IntelliJ Idea 调试/运行控制台; System.out.flush 不冲洗

javascript - JavaScript中变量字符串的XML解析

xml - 为 iOS 开发 RSS 阅读器?

c++ - 调试时未设置相对路径,为什么?