1

我有以下xml。我需要使用 xpath 查询获取根节点的所有子节点。如何编写 xpath 表达式?

<rootElement> 

  <rootElementOne xmlns="http://some.com"> 
    <rootElementTwo> 
      <Id>12345</balId> 
      <name>Name1</businessName> 
     </rootElementTwo> 
  </rootElementOne> 

  <rootElementOne xmlns="http://some.com"> 
    <rootElementTwo> 
      <Id>6789</balId> 
      <name>Name2</businessName> 
     </rootElementTwo> 
  </rootElementOne>  

</rootElement>

该表达式应返回以下结果:

      <rootElementOne xmlns="http://some.com"> 
        <rootElementTwo> 
          <Id>12345</balId> 
          <name>Name1</businessName> 
         </rootElementTwo> 
      </rootElementOne> 

      <rootElementOne xmlns="http://some.com"> 
        <rootElementTwo> 
          <Id>6789</balId> 
          <name>Name2</businessName> 
         </rootElementTwo> 
      </rootElementOne>

我尝试使用rootElement/rootElementOne/*但没有结果。

谢谢!

4

2 回答 2

6

注意这里的术语。在 XML 中,至少在 XPath 术语中,“根节点”是文档中所有元素、文本节点、注释、处理指令和其他节点的(不可见的)祖先。根节点由 XPath 表达式寻址/。它不是一个元素,而是最外层元素的父元素,也就是文档元素。在您的 XML 文档中,根节点是<rootElement>.

此 XPath 表达式将选择所有“根节点的子节点”:

/node()

但这会返回一个元素,即<rootElement>,这不是您想要的结果。

相反,您可能想要document element的所有子节点,所以这是您的 XPath 表达式:

/*/node()

这将返回<rootElementOne>元素,以及(取决于您的设置)它们之间的文本节点,其中包含空格。

或者,也许您想要文档元素的所有子元素。换句话说,您不关心文本节点、注释或除元素之外的任何内容。(很多不熟悉 XML 细节的人在表示“元素节点”时会说“节点”。)

如果这就是您想要的,那么它的 XPath 表达式是

/*/*

或者在你的情况下,你可以做

/rootElement/some:rootElementOne

wheresome在 XPath 之外声明为http://some.com. 如果您想知道如何在 Java 中为 XPath 声明名称空间前缀,请告诉我们,并向我们展示您已经在使用哪些 Java 代码来调用 XPath。或者更好的是,在这个网站上搜索,因为示例代码已经有了很好的答案。

当您尝试rootElement/rootElementOne/*时,由于命名空间,您没有选择任何内容。表单的 XPath 步骤rootElementOne(在 XPath 1.0 中)表示“在无命名空间中名为 rootElementOne 的元素”。(在 XPath 2.0 中,它的意思是“在默认的 XPath 命名空间中”,并且在 XPath 之外有一些方法可以设置默认的 XPath 命名空间。)所以您要求rootElementOne在 no namespace 中,而您的<rootElementOne>元素在http://some.com命名空间中。

如果你想与命名空间无关,你可以使用*代替rootElementOne,或者你可以使用*[local-name() = 'rootElementOne']. 但是,如果您这样做是因为您不知道如何在 XML 和 XPath 中使用名称空间,那么在您学习之前,它们可能会继续成为您的肉中刺。:-)

一旦修复,您应该得到两个<some:rootElementTwo>元素(因为您要求 的子元素rootElementOne),但这仅适用于文档根节点的上下文。这是因为以元素名称开头的 XPath 表达式X实际上是以 开头的child::X,即上下文节点的子节点。如果您当时不知道上下文节点是什么,或者不想依赖它,请使用/or开始您的 XPath 表达式//。这告诉 XPath 从文档的根节点开始。

于 2013-02-21T19:26:10.257 回答
1

/rootElement/*将返回所有rootElementOne你可以做一些动作的地方

/rootElement//*将返回以下所有内容rootElement

于 2013-02-21T12:00:59.013 回答