假设我有一个像这样的 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通常最终会在某个时候对前缀进行硬编码,这让我觉得它们很愚蠢。而且,该接口(interface)的实现通常看起来像是很多看起来很简单的代码......
最佳答案
实际上,我在问完问题几分钟后就回答了自己的问题。我需要将我的 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
关于java - 仅匹配命名空间中的 XML 节点,而不知道 NS 前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466023/