2012-08-04 78 views
2

從一個名字我如何得到s??我不會不會嵌套的。只有在同一級別的那個。這怎麼可能?xpath從兒童中獲得價值

<root available-locales="en_US" default-locale="en_US"> 
    <dynamic-element instance-id="qk6m4eST" name="image" type="image" index-type=""> 
     <dynamic-element instance-id="fHkE2dfT" name="subimage" type="image" index-type=""> 
      <dynamic-element instance-id="jbthDbC4" name="x" type="text" index-type=""> 
       <dynamic-content>23</dynamic-content> 
      </dynamic-element> 
      <dynamic-element instance-id="Rb3qRF6N" name="y" type="text" index-type=""> 
       <dynamic-content>32</dynamic-content> 
      </dynamic-element> 
      <dynamic-content><![CDATA[C:\fakepath\images (1).jpeg]]></dynamic-content> 
     </dynamic-element> 
     <dynamic-content><![CDATA[C:\fakepath\images (1).jpeg]]></dynamic-content> 
    </dynamic-element> 
    <dynamic-element instance-id="MFrJW4OR" name="image" type="image" index-type=""> 
     <dynamic-element instance-id="hjKEtVB6" name="subimage" type="image" index-type=""> 
      <dynamic-element instance-id="NrY9iZ4K" name="x" type="text" index-type=""> 
       <dynamic-content>23</dynamic-content> 
      </dynamic-element> 
      <dynamic-element instance-id="7lG7RuAC" name="y" type="text" index-type=""> 
       <dynamic-content>32</dynamic-content> 
      </dynamic-element> 
      <dynamic-content><![CDATA[C:\fakepath\grillat.jpeg]]></dynamic-content> 
     </dynamic-element> 
     <dynamic-content><![CDATA[C:\fakepath\images (1).jpeg]]></dynamic-content> 
    </dynamic-element> 
</root> 

這是我的代碼到目前爲止。它打印

測試...... 23

這就是第一個嵌套子的值。 23

public List<PopupImage> getImageNodes(Document document) { 
    List<Node> nodes = document.selectNodes("/root/dynamic-element[@name='" + IMAGE_NODE_NAME + "']"); 

    List<PopupImage> popupImages = new ArrayList<PopupImage>(); 
    for (Node node : nodes) { 
     // node.selectSingleNode("//following-sibling::dynamic-content[1]").getText(); 
     System.out.println("test...... " + node.selectSingleNode("//following-sibling::dynamic-content").getText()); 
     createPopupImage(node); 
     popupImages.add(createPopupImage(node)); 
    } 
    return popupImages; 
} 

編輯:我需要每個圖像節點和其中的動態值的值。

<root> 
    <dynamic-element name=image> 
     <dynamic-element name=subimage/> 
     <dynamic-content>content1</dynamic-content> 
    </dynamic-element> 

    <dynamic-element name=image> 
     <dynamic-element name=subimage/> 
     <dynamic-content>content2</dynamic-content> 
    </dynamic-element> 
</root> 

EDIT2:

爲了澄清更多。我需要將每個圖像節點與其中的動態內容配對。

+0

您是否閱讀過[可用軸上的spec](http://www.w3.org/TR/xpath/#axes),特別是在「after-sibling」軸上? – 2012-08-04 16:54:49

+0

我試過下面的兄弟姐妹,但它也給我嵌套的。我只需要一個在同一水平上的人。但我會閱讀。到目前爲止,我只使用過谷歌。 – pethel 2012-08-04 17:05:45

+0

'以下兄弟姐妹'不應該給你嵌套的。你能否擴展你的問題以更多地展示你到目前爲止所做的事情;即您選擇哪部分文檔,並基於此,您使用過哪些帶有「follow-sibling」的XPath來獲取兄弟姐妹? – 2012-08-04 17:07:51

回答

1

使用

/*/dynamic-element[@name='image'][1]/dynamic-content 

這將選擇任何dynamic-content這是dynamic-element是第一dynamic-element孩子的孩子頂部元素,其屬性的字符串值爲字符串"image"

而這個XPath表達式

/*/dynamic-element[@name='image']/dynamic-content 

選擇

​​

如果你只想文本節點,使用

/*/dynamic-element[@name='image']/dynamic-content/text() 

此選擇由前面的表達式中選擇的元素的以下兩個文本子節點:

C:\fakepath\images (1).jpeg 
C:\fakepath\images (1).jpeg 

可以通過迭代對返回XmlNodeList並獲得包含在每個XmlNode對象的值獲得所選擇的節點的值那裏。

+0

謝謝,但我需要這個元素<![CDATA [C:\ fakepath \ images(1).jpeg]]> pethel 2012-08-04 18:21:40

+0

@ user874774:是的, ,所以我猜測 - 請問你可以編輯這個問題,並在那裏指定應該選擇哪個節點? – 2012-08-04 18:24:21

+0

請參閱編輯 – pethel 2012-08-04 18:31:07

0

目前,選擇<dynamic-element>元素後,運行以下XPath:

//following-sibling::dynamic-content 

讓我們來看看這是什麼意思:

  • //:移回到文檔根目錄,並考慮所有節點,嵌套在任何級別。
  • following-sibling:::找到一個節點,該節點是前一個節點的兄弟節點(即在同一個嵌套級別和同一個父節點上)。
  • dynamic-content:該兄弟節點必須是<dynamic-content>元素。

這不是你想要的,正如你在文中所描述的那樣。

相反,您希望找到當前節點的下一個兄弟節點。該兄弟將是一個<dynamic-element>元素。在那個兄弟姐妹中,你想要找到一個子節點,即一個<dynamic-content>元素。

因此,試試這個XPath在node.selectSingleNode電話:

following-sibling::dynamic-element/dynamic-content 
+0

奇怪。它工作一次迭代。第二個「圖像」拋出一個空指針。 – pethel 2012-08-04 17:51:38

+0

@ user874774:那麼,第二個圖像的名稱是什麼? – 2012-08-04 17:54:13

+0

應該與第一次迭代相同 節點...... [email protected] [元素:] text ...... C:\ fakepath \ images(1).jpeg 路徑....../root/dynamic-element/dynamic-content 第二次迭代 node .... null – pethel 2012-08-04 17:56:46