当前位置: 首页 > 面试题库 >

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

杨飞
2023-03-14
问题内容

这是输入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));


 类似资料:
  • 我想使用JAXB来 将xml解组为java对象, 将其封送回xml 并使用名称空间生成完全相同的输出 下面是原始的 XML: 我正在使用以下POJO: 我用于取消/编组的代码: 这实际上不起作用,我甚至无法解组初始xml。但是如果我尝试封送一个POJO,我只在代码中设置字段。我得到以下结果: 我如何摆脱这个ns3前缀?

  • 问题内容: 我有一个丑陋的XML,上面有很多名称空间,当我尝试通过simpleXML加载它(如果我指示第一个名称空间)时,我会得到一个xml对象,但是后面带有其他名称空间的标记不会使它成为该对象。 如何解析该XML? 我试图用下面的代码解析它 但是$ xml对象仅包含以下内容 问题答案: 我认为您需要注册名称空间并使用XPath进行访问。如下所示的内容应该可以帮助您(我没有设施可以对此进行测试)。

  • 我使用JAXB从SOAP响应中解析xml元素。我已经为xml元素定义了POJO类。我已经测试了没有名称空间和前缀的pojo类,它工作得很好。需求是解析来自SOAPMessage对象的输入

  • 面临使用JAXB解组的问题。我需要使用多个名称空间。Java类是为第三方提供的XSD生成的。因此,我不想在Java类中的XMLRootElement指定名称空间,也不想手动更改多个类。 编组逻辑如下: xmlelement类TokenRequest.java BasicInRequestType.java 我在package-info.java中指定了前缀 TokenRequest元素实际上引用了

  • 我正在开发一个客户端来使用 Web 服务,但由于某种原因,除非所有命名空间都正确且没有任何前缀,否则我的请求没有得到正确处理。 我所有的类都是由服务提供商使用提供的XSD和WSDL创建的。 NfeDadosMsg.class 包装信息.java TConsStatServ.class package br.inf.portalfiscal.nfe; 包装信息.java 输出xml: 由于某种原因,

  • 问题内容: 我正在做这个小项目,我的任务是读取xml文件并进行解析,以便可以将其存储在类中。这是xml示例。它是用SOAP编写的,我要做的就是获取 xmlns:ns2="http://abc.examples.com 问题答案: 要使用Java中的命名空间进行XPath查询,我相信您需要执行以下操作: 您还需要先调用;,然后再创建来解析文档。