假设我有这样的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通常最终会在某些地方对前缀进行硬编码这点,让他们看起来很愚蠢。而且,该界面的实现通常看起来像很多代码,看起来非常简单......
答案 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