繁体   English   中英

如何在不考虑 Java 中的命名空间名称的情况下从 XML 获取 Node?

[英]How to get Node from XML without considering namespace name in Java?

我正在编写一个 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());

但它给出了空指针异常,因为函数没有读取所需的节点。 我浏览了这个链接以供参考。 有人可以告诉我我在这里做错了什么吗?

这是由返回的 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不返回元素。

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

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

DocumentBuilderFactory.setNamespaceAware(true);

或者没有命名空间支持,您可以搜索

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM