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

在Java中,如何在不考虑名称空间名称的情况下从XML获取节点?,java,xml,xml-parsing,Java,Xml,Xml Parsing,我正在编写一个java程序,其中我正在解析输入xml文件,如下所示: ... <ems:DeterminationRequest> <ems:MessageInformation> <ns17:MessageID xmlns:ns17="http://www.calheers.ca.gov/EHITSAWSInterfaceCommonSchema">1000225404</ns17:MessageID> <

我正在编写一个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>
...

但它给出了空指针异常,因为函数并没有读取必需的节点。我看了一下以供参考。有人能告诉我这里做错了什么吗?

这是由返回的den
NodeList
实现中的一种奇怪/错误行为

doc.getDocumentElement().getElementsByTagnames(“*”,“MessageInformation”)

它允许您访问
项(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);
    ...
}

然后需要找出
getelementsbytagnames
不返回元素的原因

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

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

DocumentBuilderFactory.setNamespaceAware(true);
或者,如果没有命名空间支持,您可以搜索

NodeList nl = doc.getDocumentElement().getElementsByTagName("ems:MessageInformation");
感谢您的回复:)。“DocumentBuilderFactory.setNamespaceAware(true);”这项更改对我很有效。
NodeList nl = doc.getDocumentElement().getElementsByTagName("ems:MessageInformation");