简体   繁体   English

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

[英]Looping in Xpath Expression having Namespace

Suppose this my Sample XML with Namespaces 假设这是我的带有命名空间的示例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>

I have a sample Xpath expression which I use in Java 我有一个在Java中使用的示例Xpath表达式

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

Output: 10.100.100.10 输出:10.100.100.10

But how to Iterate and fetch the 2nd management-ip ie 10.100.100.11 但是如何迭代并获取第二个管理IP,即10.100.100.11

I tried the below expression with vdur[2] , but it didn't worked. 我用vdur [2]尝试了下面的表达式,但是没有用。

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

How to fetch the 2nd management IP using expression?????? 如何使用表达式获取第二个管理IP

Your query has two mistakes: 您的查询有两个错误:

  1. You should not get into id element since it does not contain management-ip , they are on the same level of hierarchy 您不应该进入id元素,因为它不包含management-ip ,它们处于同一层次结构上
  2. *[local-name() = 'vdur[2]'] should be replaced with *[local-name() = 'vdur'][2] *[local-name() = 'vdur[2]']应替换为*[local-name() = 'vdur'][2]

Below is my query that seems working: 以下是我的查询似乎有效:

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

This is tested on 经过测试

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

Above is your example but amended a bit since you are not declaring the namespace. 上面是您的示例,但由于未声明名称空间,因此进行了一些修改。

Output: 输出:

Text='10.100.100.11'

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

Your correct query would look like this: 您正确的查询如下所示:

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

As Alexey resolve your one issue. 作为Alexey解决您的一个问题。 below is the answer to getting the length of an attribute 以下是获取属性长度的答案

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

Use count keyword 使用计数关键字

Source 资源

count of element in XPath XPath中元素的数量

Hope it will help you :) 希望它能对您有所帮助:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM