【问题标题】:How to get Node from XML without considering namespace name in Java?如何在不考虑 Java 中的命名空间名称的情况下从 XML 获取 Node?
【发布时间】:2015-11-03 10:00:33
【问题描述】:

我正在编写一个 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 以供参考。谁能告诉我我在这里做错了什么?

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    这是由

    返回的 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");
    

    【讨论】:

    • 感谢您的回复:)。 “DocumentBuilderFactory.setNamespaceAware(true);”这个改变对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多