java - 不同位置节点的通用 xpath

标签 java xml xpath

我有很多来自不同版本架构的 xml 文件。这些 xml 中的某些部分/标签是相同的。
我想要做的是找到一个特定的标签并开始处理该标签。问题是这个标签可能出现在 xml 中的不同位置。
所以我正在寻找一个 xpath 来定位这个节点,无论它的位置如何。我正在使用 Java 编写处理代码。
以下是 xml 的各种优点
示例1

<nodeIWant>
       <book>
          <title>Harry Potter and the Philosophers Stone</title>
          ...
       </book>
</nodeIWant>

示例 2

<a>
   <nodeIWant>
      <book>
         <title>Harry Potter and the Philosophers Stone</title>
         ...
      </book>
   </nodeIWant>
</a>

示例 3

<b>
   <nodeIWant>
      <book>
         <title>Harry Potter and the Philosophers Stone</title>
         ...
      </book>
   </nodeIWant>
</b>

在上面的 xml 中,我想使用相同的 xpath 来定位节点“nodeIWant”。

我使用的Java代码如下

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document modelDoc = docBuilder.parse(args[0]);

XPath xPath = XPathFactory.newInstance().newXPath();
System.out.println(xPath.evaluate("//nodeIWant", modelDoc.getDocumentElement(), XPathConstants.NODE));

这会打印出 null。

最终编辑
Mathias Müller 的答案适用于这些 xml 文件。我实际上正在尝试查询 Rational Software Architect 中的 .emx 文件。我试图避免使用这些例子。 (请不要开始谈论 BIRT 和使用 eclipse uml API 等...我已经尝试过这些,但它们没有给我我想要的东西。) 文件结构如下

    <?xml version="1.0" encoding="UTF-8"?>
<!--xtools2_universal_type_manager-->
<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.uml.msl.model" version="7.0.0"><feature description="" name="com.ibm.xtools.ruml.feature" url="" version="7.0.0"/></signature>?>
<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.mmi.ui.signatures.diagram" version="7.0.0"><feature description="" name="Rational Modeling Platform (com.ibm.xtools.rmp)" url="" version="7.0.0"/></signature>?>
<xmi:XMI version="2.0" xmlns:Default="http:///schemas/Default/_fNm3AAqoEd6-N_NOT9vsCA/2" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/3.0.0/UML" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:///schemas/Default/_fNm3AAqoEd6-N_NOT9vsCA/2 pathmap://UML2_MSL_PROFILES/Default.epx#_fNwoAAqoEd6-N_NOT9vsCA?Default/Default?">
  <uml:Model name="A" xmi:id="_4lzSsMywEeGAuoBpYhfj6Q">
  <!-- Lot of other stuff -->
  </uml:Model>
<xmi:XMI>


另一个文件是

    <?xml version="1.0" encoding="UTF-8"?>
<!--xtools2_universal_type_manager-->
<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.uml.msl.model" version="7.0.0"><feature description="" name="com.ibm.xtools.ruml.feature" url="" version="7.0.0"/></signature>?>
<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.mmi.ui.signatures.diagram" version="7.0.0"><feature description="" name="Rational Modeling Platform (com.ibm.xtools.rmp)" url="" version="7.0.0"/></signature>?>
<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/3.0.0/UML" xmi:id="_4lzSsMywEeGAuoBpYhfj6Q" name="A">
<!-- Lot of other stuff -->
</uml:Model>


'//Model' 的 xpath 不应该也适用于这两个示例吗?

最佳答案

您可以使用 xPath“轴”//。这会在文件中搜索您的节点,而不关心父节点。因此,在您的示例中,您可以使用:

//nodeIWant

关于java - 不同位置节点的通用 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28195001/

相关文章:

xml - 使用宏将数据从映射的 excel 导出到 XML

Java Web 应用程序 - 下载的文件不可读

java - JAXB2基础知识可合并插件: Setting a custom Merge Strategy

iphone - 使用 TouchXML 解析 SO RSS 提要,未找到 <entry> 标记

xml - 比较xslt转换上的值

ruby - 用于类似正则表达式匹配的 xpath 表达式?

html - 如何使用 XSL 从 html 中提取标题和描述等元数据

java - Documentum 6.5 与 JBOSS 5.1 问题

java - 如何在 Java 中不公开公共(public)接口(interface)

android - 仅在按钮上水平和垂直居中图标(而不是文本)