我有以下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>
Run Code Online (Sandbox Code Playgroud)
表达式应返回以下结果:
<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>
Run Code Online (Sandbox Code Playgroud)
我尝试使用rootElement/rootElementOne/*但没有结果.
谢谢!
请注意这里的术语.在XML中,至少在XPath术语中,"根节点"是文档中所有元素,文本节点,注释,处理指令和其他节点的(不可见)祖先.根节点由XPath表达式寻址/.它不是元素,而是最外层元素的父元素,也就是文档元素.在XML文档中,根节点是父节点<rootElement>.
此XPath表达式将选择所有"根节点的子节点":
/node()
Run Code Online (Sandbox Code Playgroud)
但那将返回一个元素,即<rootElement>,这不是你想要的结果.
相反,您可能需要document元素的所有子节点,因此这是您的XPath表达式:
/*/node()
Run Code Online (Sandbox Code Playgroud)
这将返回<rootElementOne>元素,并(根据您的设置)还返回它们之间的文本节点,它由空格组成.
或者,也许你想要文档元素的所有元素子元素.换句话说,除了元素之外,您不关心文本节点,注释或任何其他内容.(许多不熟悉XML细节的人在表示"元素节点"时会说"节点".)
如果这就是你想要的,那么它的XPath表达式就是
/*/*
Run Code Online (Sandbox Code Playgroud)
或者在你的情况下,你可以做到
/rootElement/some:rootElementOne
Run Code Online (Sandbox Code Playgroud)
在someXPath外部声明的位置作为名称空间前缀http://some.com.如果您想知道如何在Java中声明XPath的名称空间前缀,请告诉我们,并向我们展示您已经用于调用XPath的Java代码.或者更好的是,在这个网站上搜索,因为示例代码已经有了很好的答案.
当您尝试时rootElement/rootElementOne/*,由于命名空间,您没有选择任何内容.表单的XPath步骤rootElementOne(在XPath 1.0中)表示"没有名称空间中名为rootElementOne的元素".(在XPath 2.0中,它表示"在默认的XPath名称空间中",并且XPath之外还有一些方法可以设置默认的XPath名称空间.)所以你要求rootElementOne没有名称空间,而你的<rootElementOne>元素在http://some.com名称空间中.
如果您想与命名空间无关,则可以使用*而不是rootElementOne,或者您可以使用*[local-name() = 'rootElementOne'].但是,如果你这样做是因为你不知道如何在XML和XPath中使用命名空间,那么在你学习之前,它们可能会继续成为你肉体的刺.:-)
一旦修复了,你应该得到两个<some:rootElementTwo>元素(因为你要求子元素rootElementOne),但这只能在文档的根节点的上下文中工作.这是因为以元素名称开头的XPath表达式X实际上child::X是以上下文节点的子节点开头的.如果您当时不知道上下文节点是什么,或者不想依赖它,请使用/或启动XPath表达式//.这告诉XPath从文档的根节点开始.
| 归档时间: |
|
| 查看次数: |
24674 次 |
| 最近记录: |