如何从Java中获取Node而不考虑Java中的命名空间名称?

时间:2015-11-03 10:00:34

标签: 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>
...

现在我正在尝试获取节点&#34; ems:MessageInformation&#34;不考虑命名空间名称&#34; ems&#34;。所以我尝试了以下几行代码:

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

但是它给出了Null Pointer异常,因为函数没有读取所需的节点。我浏览了这个link以供参考。有人能告诉我这里我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

这是

返回的den NodeList实现中的奇怪/错误行为

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

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

要阻止NullPointerException,您应首先检查返回的NodeList是否有长度&gt; 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");