2017-08-31 115 views
0

假设这是我的示例XML命名空间与循环中的XPath表达式有命名空间

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

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

输出使用示例XPath表达式: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

你的查询有两个错误:

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

是的,但我想它将在忽略xPath命名空间的情况下完成。这不工作! – Tushar

+0

@Tushar看到我答案的最后一行。同时检查你的错误从我的回答顶部 –

+0

好吧知道了......但有一个疑问,如何找到Java中给定的XML中可用的“vdur”属性的长度? – Tushar

0

由于阿列克谢解决您的一个问题。下面的答案是获得一个属性的长度

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

使用次数的关键字

来源

count of element in XPath

希望它会帮助你:)