2017-08-31 62 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

希望它會幫助你:)