2

ここで lxml の解析に関するかなりの数の質問を見てきました。それらはすべて非常に便利ですが、解析対象のファイルの構造に固有の問題もあります。

私の場合、次のようなxmlがあります。

<documents>
    <document>
        <id>123456</id>
        <element name="name">
            <value><![CDATA[john doe]]></value>
        </element>
        <element name="address">
            <value><![CDATA[no name street]]></value>
        </element>
    </document>
</documents>

実際の xml にはさらに多くの要素がありますが、これは単なる例です。私の最終的な目的は、この情報の一部を csv に抽出して、次の結果を得ることです。

id, name, address
123456,john doe,no name street

ただし、私の問題は、ファイルを解析して、条件に応じて「値」要素内の値を取得することです (親の「要素」に特定の属性がある場合)。

解析する実際のファイルは約 8 GB であるため、lxml の iterparse を使用して大きなツリーをメモリに格納しないようにするのが最善であると考えました。

これは私が今持っているコードです。「要素」の属性「名前」がリスト「属性」で指定された値と等しい場合、次の要素からのテキストをチェックしようとすると、最後に行き詰まります。

from lxml import etree

attributes = ("name", "address")
context = etree.iterparse("test.xml", tag="document")

for event, element in context:
    for child in element:
        if child.attrib.get("name") in attributes:
            print child.getnext().text

助けてくれてありがとう!

4

1 に答える 1