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

标签 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通常最终会在某个时候对前缀进行硬编码,这让我觉得它们很愚蠢。而且,该接口(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/

相关文章:

java - 使用 Java 的莱布尼茨公式

java - 如何修复 'com.vaadin.DefaultWidgetSet' 不包含 com.vaadin.addon.charts.Chart 的实现

python - 为什么我无法将 lxml.etree._ElementUnicodeResult 转换为字符串?

java - 如何以及在哪里检查某些 Apache Camel 设置

java - 使用 'spring boot + mybatis'创建的项目使用 'spring Application'可以启动,如果使用外部tomcat,注入(inject)dao报错

xml - 使用 <xs :all> in XML schema's complexType?

java - 使用序列化是个好主意吗?

python - 如何使用 lxml 解析包含前缀但没有 namespace 声明的 XML?

java - 比较两个 XML 文件的结构

xslt - if 条件与字符串长度