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

时间:2017-08-31 10:59:19

标签: java xml xpath nodes xml-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>

我有一个示例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

2 个答案:

答案 0 :(得分:0)

您的查询有两个错误:

  1. 您不应该进入id元素,因为它不包含management-ip,它们位于同一级别的层次结构中
  2. *[local-name() = 'vdur[2]']应替换为*[local-name() = 'vdur'][2]
  3. 以下是我的查询似乎有效:

    /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关键字

来源

count of element in XPath

希望它会对你有所帮助:)。