我是XPath的新手,所以我需要一些帮助来解决这个问题。我有一个像这样的XML文件:
<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将输出“Type 1”,“Type 2”,“Type 3”
我一直在谷歌搜索没有太多运气。任何帮助将不胜感激!
答案 0 :(得分:3)
这有效:
(/items/item[brandName='Brand 1']/productTypes/productType)[not(text()=preceding::*)]
工作原理:第一个(...)
获取brandName ='Brand 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']