使用xpath获取子节点?

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

   12345 Name1     6789 Name2    

表达式应返回以下结果:

    12345 Name1     6789 Name2   

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

谢谢!

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

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

 /node() 

但是这会返回一个元素,即 ,这不是你想要的结果。

相反,您可能需要document元素的所有子节点,因此这是您的XPath表达式:

 /*/node() 

这将返回元素,以及(取决于您的设置)它们之间的文本节点,它由空格组成。

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

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

 /*/* 

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

 /rootElement/some:rootElementOne 

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

当您尝试使用rootElement/rootElementOne/* ,由于名称空间,您没有选择任何内容。 forms为rootElementOne的XPath步骤(在XPath 1.0中)表示“没有名称空间中名为rootElementOne的元素”。 (在XPath 2.0中,它表示“在默认的XPath命名空间中”,并且XPath之外还有一些方法可以设置默认的XPath命名空间。)所以你在没有命名空间的情况下要求rootElementOne ,而你的元素在http://some.com命名空间。

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

一旦修复了,你应该得到两个元素(因为你要求rootElementOne子元素),但这只能在文档的根节点的上下文中工作。 这是因为以元素名称X开头的XPath表达式实际上是以child::X开头的,这意味着上下文节点的子节点。 如果您当时不知道上下文节点是什么,或者不想依赖它,请使用///启动XPath表达式。 这告诉XPath从文档的根节点开始。

/rootElement/*将返回所有rootElementOne ,您可以在其中执行某些操作

/rootElement//*将返回rootElement下面的所有内容