我正在寻找一个XPath表达式来获取节点的默认命名空间 .
我的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
-nodes .
/aaa/*[name()='bbb' and position()=1]/namespace::*
此表达式不会选择任何内容 .
如果有人暗示我,我将不胜感激 .
2 回答
你的表达
是正确的,返回三个命名空间节点 . 问题可能在于返回它们后处理这些节点的方式 . 该表达式应该在XPath 1.0和XPath 2.0中都有效,尽管我还没有使用内置于JDK的XPath引擎进行检查 .
(顺便提一下,因为你使用的是JDK 1.7,所以你使用的是XPath 1.0是一个完整的非sequitur,因为有几个XPath 2.0引擎可供Java用户使用) .
要仅返回与默认命名空间对应的命名空间URI,请使用
或者实际上,由于此查询已假定bbb元素位于默认命名空间中,因此请使用
这page解释了xpath中的namespace-uri函数 .
看起来你想要这样的东西:
如果未指定名称空间,则会得到一个空字符串作为结果 .
编辑:我重读了你的问题,我不确定我的答案是你在寻找什么 . namespace-uri函数用于查找
<ns1:bbb>
等节点的uri . 它将返回ns1的uri . 我不确定有没有办法使用x-path查看名称空间定义,而不是实际使用它们 .