2012-06-19 174 views
2

我對XPath有點新手,所以我需要一些幫助來解決這個問題。我有這樣的XML文件:在嵌套節點中獲取唯一的XPath節點值

<items> 
    <item> 
     <brandName>Brand 1</brandName> 
     <productTypes> 
      <productType>Type 1</productType> 
      <productType>Type 3</productType> 
     </productTypes> 
    </item> 
    <item> 
     <brandName>Brand 1</brandName> 
     <productTypes> 
      <productType>Type 2</productType> 
      <productType>Type 3</productType> 
     </productTypes> 
    </item> 
    <item> 
     <brandName>Brand 2</brandName> 
     <productTypes> 
      <productType>Type 4</productType> 
      <productType>Type 5</productType> 
     </productTypes> 
    </item> 
</items> 

我試圖找出一種方法來獲取特定品牌的所有獨特productType。例如,「品牌1」的所有唯一productType將輸出「類型1」,「類型2」,「類型3」

我一直在使用Google,但沒有多少運氣。任何幫助,將不勝感激!

+0

我不認爲你可以在一個節點集XPath表達式進行獨特的操作,你需要在任何一種語言,你使用的解析表達式一些額外的代碼。 – jspboix

回答

3

這工作:

(/items/item[brandName='Brand 1']/productTypes/productType)[not(text()=preceding::*)] 

它是如何工作:第一(...)獲得名優產品= '品牌1' 的所有productType。在這一點上,我有一個productType節點的列表。現在,我選擇節點文本未包含在當前節點之前的節點中的節點。

嘗試在Python:

n = libxml2dom.parseString(xml) 
[x.textContent for x in n.xpath("(/items/item[brandName='Brand 1']/productTypes/productType)[not(text()=preceding::*)]")] 
>>> [u'Type 1', u'Type 3', u'Type 2'] 
+0

工作就像一個魅力,謝謝你! –