我正在寻找一个XPath Expression来获取节点的默认命名空间。
我的XML文档可能如下所示。
<aaa>
<bbb xmlns="ns1" xmlns:ggg="ns2" attribute="value" attribute2="value2">
<ccc />
</bbb>
<bbb xmlns="ns4" xmlns:ggg="ns5" attribute="value" attribute2="value2">
<ddd />
</bbb>
</aaa>
我想得到ns1
。我已尝试使用以下表达式,但没有一个工作(我在Java 1.7中编程(因此它是XPath 1.0)并使用http://chris.photobooks.com/xml/default.htm上的在线XPath可视化工具进行测试。
/aaa/*[name()='bbb' and position()=1]/attribute::*
此表达式仅选择attribute
- 和attribute2
- 节点。
/aaa/*[name()='bbb' and position()=1]/namespace::*
此表达式不会选择任何内容。
如果有人暗示我,我将不胜感激。
答案 0 :(得分:3)
你的表达
/aaa/*[name()='bbb' and position()=1]/namespace::*
是正确的并返回三个命名空间节点。问题可能在于返回它们后处理这些节点的方式。该表达式应该在XPath 1.0和XPath 2.0中都有效,尽管我没有使用内置于JDK的XPath引擎进行检查。
(顺便提一下,因为您使用的是JDK 1.7,因此您使用的是XPath 1.0,因为Java用户可以使用多个XPath 2.0引擎,因此使用XPath 1.0。)
要仅返回与默认命名空间对应的命名空间URI,请使用
/aaa/*[name()='bbb' and position()=1]/namespace::*[name()='']
或者实际上,由于此查询已假定bbb元素位于默认命名空间中,请使用
namespace-uri(/aaa/*[name()='bbb' and position()=1])
答案 1 :(得分:0)
这个page解释了xpath中的namespace-uri函数。
看起来你想要这样的东西:
namespace-uri(/aaa/*[name()='bbb' and position()=1])
如果未指定命名空间,则会得到一个空字符串作为结果。
编辑:我重读了你的问题,我不确定我的答案是你在寻找什么。 namespace-uri函数用于查找<ns1:bbb>
等节点的uri。它将返回ns1的uri。我不确定有没有办法使用x-path查看命名空间定义,而不是实际使用它们。