我正在编写一个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:MessageInformation”而不考虑名称空间名称“ ems”。所以我尝试了以下代码行:
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供参考。有人可以告诉我我在做什么错吗?
最佳答案
这是由返回的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");