有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java只匹配命名空间中的XML节点,而不知道NS前缀

假设我有一个UPnP SOAP响应,如下所示:

<?xml version="1.0"?>
<m:head xmlns:m="dont_care_about_any_node_in_this_namespace">
  <m:body xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">
    <u:SomeFunctionResponse>
      <u:OutParamName>Some Text</u:OutParamName>
    </u:SomeFunctionResponse>
  </m:body>
</m:head>

我想选择具有u名称空间前缀的所有节点,但是:

  • u命名空间中的节点名称可能不同
  • 我不知道名称空间前缀是u提前的,它可以是任何东西
  • 我只知道我用来调用操作的服务,在本例中是urn:schemas-upnp-org:service:WANPPPConnection:1

如何仅选择u节点?比如:

//urn:schemas-upnp-org:service:WANPPPConnection:1/*

我看过一些关于实现NamespaceContext的文章,但我不明白它的作用,也不知道如何使用它。。。那些examples通常会在某个时候硬编码前缀,这让我觉得它们很愚蠢。而且,该接口的实现通常看起来像是一些非常简单的东西的大量代码


共 (1) 个答案

  1. # 1 楼答案

    实际上,我在问了几分钟后就回答了自己的问题。我需要将我的DocumentBuilderFactory设置为命名空间感知:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    Document doc = dbf.newDocumentBuilder().parse("myxml.xml");
    XPath xp = XPathFactory.newInstance().newXPath();
    XPathExpression xpe = xp.compile("//*[namespace-uri()='urn:schemas-upnp-org:service:WANPPPConnection:1']");
    NodeList nl = (NodeList) xpe.evaluate(doc, XPathConstants.NODESET);
    for(int i = 0; i < nl.getLength(); i++){
      Element e = (Element) nl.item(i);
      System.out.println(e.getNodeName());
    }
    

    输出:

    u:SomeFunctionResponse
    u:OutParamName