ここで 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
助けてくれてありがとう!