我有以下xml。 我需要使用xpath查询获取根节点的所有子节点。 我该如何写xpath表达式?
12345
Name1
6789
Name2
该表达式应返回以下结果:
12345
Name1
6789
Name2
我尝试使用rootElement/rootElementOne/*,但没有结果。
谢谢!
您是否尝试过rootElementrootElementOne?
@ beny23:注意上的默认名称空间声明。
在这里提防术语。在XML中,至少在XPath术语中,"根节点"是文档中所有元素,文本节点,注释,处理指令和其他节点的(不可见)祖先。根节点由XPath表达式/寻址。它不是元素,而是最外层元素(也称为document元素)的父元素。在XML文档中,根节点是的父节点。
此XPath表达式将选择所有"根节点的子节点":
/node()
但这将返回一个元素,即,这不是您想要的结果。
相反,您可能需要document元素的所有子节点,所以这是您的XPath表达式:
/*/node()
这将返回元素,以及(取决于您的设置)它们之间的文本节点,该文本节点由空格组成。
另外,也许您想要document元素的所有子元素。换句话说,除了元素之外,您无需关心文本节点,注释或其他任何内容。 (许多不熟悉XML细节的人在表示"元素节点"时都说"节点"。)
如果这就是您想要的,则它的XPath表达式是
/*/*
或者您可以
/rootElement/some:rootElementOne
其中some在XPath外部声明为http://some.com的名称空间前缀。如果您想知道如何在Java中声明XPath的名称空间前缀,请告诉我们,并向我们展示您已经在使用什么Java代码来调用XPath。或者更好的是,在此站点上搜索,因为示例代码已经有了很好的答案。
尝试rootElement/rootElementOne/*时,由于名称空间而未选择任何内容。格式为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以下的所有内容
较小的更正:rootElement*将选择作为rootElement后代的所有元素。 它不会选择文本节点等。