在具有命名空间的 Xpath 表达式中循环

Looping in Xpath Expression having Namespace

假设这是我的示例 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?????

您的查询有两个错误:

  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()

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

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

使用计数关键字

来源

count of element in XPath

希望对您有所帮助:)