【问题标题】:XPath Expression for getting default namespace用于获取默认命名空间的 XPath 表达式
【发布时间】:2013-12-09 19:43:12
【问题描述】:

我正在寻找一个 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-节点。

/aaa/*[name()='bbb' and position()=1]/namespace::*

这个表达式没有选择任何东西。

如果有人对我有提示,我将不胜感激。

【问题讨论】:

    标签: xml xpath namespaces xml-namespaces


    【解决方案1】:

    你的表情

    /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 引擎)。

    要仅返回与默认命名空间对应的命名空间 URI,请使用

    /aaa/*[name()='bbb' and position()=1]/namespace::*[name()='']
    

    实际上,由于此查询已经假定 bbb 元素位于默认命名空间中,因此使用

    namespace-uri(/aaa/*[name()='bbb' and position()=1])
    

    【讨论】:

    • 感谢您的回答。我很高兴我没有犯错。它确实是 XPath 引擎中的构建。现在我正在使用撒克逊图书馆,一切正常。
    【解决方案2】:

    这个page 解释了xpath 中的namespace-uri 函数。

    看起来你想要这样的东西:

    namespace-uri(/aaa/*[name()='bbb' and position()=1])
    

    如果没有指定命名空间,你会得到一个空字符串作为结果。

    编辑:我重读了您的问题,但不确定我的答案是否是您正在寻找的。 namespace-uri 函数用于查找像 &lt;ns1:bbb&gt; 这样的节点的 uri。它将返回 ns1 的 uri。我不确定是否有一种方法可以使用 x-path 来查看命名空间定义,而不是在实际使用它们时。

    【讨论】:

    • 嗨,你确实理解我的意思。这是一个很好的解决方案,尽管像我的查询一样,它在 XPath 引擎中构建时不起作用。对撒克逊图书馆的更改效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2010-10-07
    • 2014-02-04
    • 2018-09-25
    相关资源
    最近更新 更多