java – 无法使用DOM解析器读取带有名称空间前缀的xml

这是输入XML

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:SendResponse xmlns:ns2="http://mycompany.com/schema/">
         <ns2:SendResult>
            <ns2:Token>A00179-02</ns2:Token>
         </ns2:SendResult>
      </ns2:SendResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是我用来读取XML的代码(变量xmlString包含上面的XML):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xmlString));
Document doc = db.parse(is);

System.out.println("Element :" + doc.getElementsByTagName("Token").item(0));
System.out.println("Element :" + doc.getElementsByTagName("ns2:Token").item(0));

输出:

Element :null
Element :[ns2:Token: null]

如果我使用“ns2:Token”作为标记名称,我能够读取该元素,但我不想在我的代码中使用该前缀,因为我不确定它是否相同或更改为未来.有没有办法在不对标记名称中的命名空间进行硬编码的情况下读取xml元素?

最佳答案
命名空间元素的W3C dom方法:

getElementsByTagNameNS

NodeList getElementsByTagNameNS(String namespaceURI,
                                String localName)

    Returns a NodeList of all the Elements with a given local name and namespace URI in document order.

    Parameters:
        namespaceURI - The namespace URI of the elements to match on. The special value "*" matches all namespaces.
        localName - The local name of the elements to match on. The special value "*" matches all local names. 
    Returns:
        A new NodeList object containing all the matched Elements.
    Since:
        DOM Level 2

IIRC早期版本的W3C DOM对名称空间的支持很少,所以我不使用它.但是,如果您使用上面的完整namespaceURI http://schemas.xmlsoap.org/soap/envelope/,它应该工作.前缀不重要 – 它在使用它的文档之外没有永久性.

所以尝试:

System.out.println("Element :" + doc.getElementsByTagNameNS(
        "http://schemas.xmlsoap.org/soap/envelope/", "Token").item(0));

转载注明原文:java – 无法使用DOM解析器读取带有名称空间前缀的xml - 代码日志