在具有命名空间的 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?????
您的查询有两个错误:
- 你不应该进入
id
元素,因为它不包含 management-ip
,它们在同一层级
*[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
希望对您有所帮助:)
假设这是我的示例 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?????
您的查询有两个错误:
- 你不应该进入
id
元素,因为它不包含management-ip
,它们在同一层级 *[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
希望对您有所帮助:)