2

私は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 は、「タイプ 1」、「タイプ 2」、「タイプ 3」を出力します。

私はあまり運がなくてもグーグルしています。どんな助けでも大歓迎です!

4

1 に答える 1

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']
于 2012-06-19T17:37:33.180 に答える