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

时间:2013-12-09 08:15:51

标签: java xml xpath namespaces upnp

假设我有这样的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 个答案:

答案 0 :(得分:1)

我在询问后几分钟后回答了我自己的问题。我需要将DocumentBuilderFactory设置为NameSpace Aware:

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