假设这是我的带有命名空间的示例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>
我有一个示例Xpath表达式,我在Java中使用
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答案 0 :(得分:0)
您的查询有两个错误:
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()
答案 1 :(得分:0)
阿列克谢解决你的问题。以下是获取属性长度的答案
While xxx is the tag prefix, use just count(//Formulas/yyy)
使用count关键字
来源
希望它会对你有所帮助:)。