【问题标题】:Looping in Xpath Expression having Namespace在具有命名空间的 Xpath 表达式中循环
【发布时间】:2017-08-31 10:59:19
【问题描述】:

假设这是我的带有命名空间的示例 XML

<data>
    <vnfr:vnfr-catalog xmlns:vnfr="urn:ietf:params:xml:ns:yang:nfvo:vnfr">
        <vnfr:vnfr>
            <vnfr:id>1234</vnfr:id>
                <vnfr:vdur>
                    <vnfr:id>987</vnfr:id>
                    <vnfr:id>987</vnfr:id>
                    <vnfr:management-ip>10.100.100.10</vnfr:management-ip>
                </vnfr:vdur>
                <vnfr:vdur>
                    <vnfr:id>567</vnfr:id>
                    <vnfr:id>567</vnfr:id>
                    <vnfr:management-ip>10.100.100.11</vnfr:management-ip>
                </vnfr:vdur>
        </vnfr:vnfr>
    </vnfr:vnfr-catalog>
</data>

我有一个在 Java 中使用的示例 Xpath 表达式

expression="/data/*[local-name() = 'vnfr-catalog']/*[local-name() = 'vnfr']/*[local-name() = 'id']/*[local-name() = 'vdur']/*[local-name() = 'management-ip']/text()";

输出:10.100.100.10

但是如何迭代和获取第二个管理 IP,即 10.100.100.11

我用 vdur[2] 尝试了下面的表达式,但没有成功。

expression="/data/*[local-name() = 'vnfr-catalog']/*[local-name() = 'vnfr']/*[local-name() = 'id']/*[local-name() = 'vdur[2]']/*[local-name() = 'management-ip']/text()";

如何使用表达式获取第二个管理 IP??????

【问题讨论】:

    标签: java xml xpath nodes xml-namespaces


    【解决方案1】:

    您的查询有两个错误:

    1. 你不应该进入id元素,因为它不包含management-ip,它们在同一层次结构中
    2. *[local-name() = 'vdur[2]'] 应替换为 *[local-name() = 'vdur'][2]

    以下是我的查询似乎有效:

    /data/vnfr:vnfr-catalog/vnfr:vnfr/vnfr:vdur[2]/vnfr:management-ip/text()
    

    这是在测试

    <data xmlns:vnfr="asdasdas">
        <vnfr:vnfr-catalog>
            <vnfr:vnfr>
                <vnfr:id>1234</vnfr:id>
                    <vnfr:vdur>
                        <vnfr:id>987</vnfr:id>
                        <vnfr:id>987</vnfr:id>
                        <vnfr:management-ip>10.100.100.10</vnfr:management-ip>
                    </vnfr:vdur>
                    <vnfr:vdur>
                        <vnfr:id>567</vnfr:id>
                        <vnfr:id>567</vnfr:id>
                        <vnfr:management-ip>10.100.100.11</vnfr:management-ip>
                    </vnfr:vdur>
            </vnfr:vnfr>
        </vnfr:vnfr-catalog>
    </data>
    

    上面是你的例子,但由于你没有声明命名空间,所以做了一些修改。

    输出:

    Text='10.100.100.11'
    

    https://www.freeformatter.com/xpath-tester.html测试

    您的正确查询如下所示:

    /data/*[local-name() = 'vnfr-catalog']/*[local-name() = 'vnfr']/*[local-name() = 'vdur'][2]/*[local-name() = 'management-ip']/text()
    

    【讨论】:

    • 是的,但我希望在忽略 xPath 命名空间的情况下完成。那不行!!!
    • @Tushar 看到我回答的最后一行。还要从我的答案顶部检查你的错误
    • Ok 明白了......但是有人怀疑如何通过 Java 找到给定 XML 中可用的“vdur”属性的长度?????
    • 不要在 cmets 中问补充问题。问一个新问题。
    【解决方案2】:

    Alexey 解决了您的一个问题。下面是获取属性长度的答案

    While xxx is the tag prefix, use just count(//Formulas/yyy)
    

    使用计数关键字

    来源

    count of element in XPath

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2015-06-21
      • 2011-04-25
      相关资源
      最近更新 更多