十分な大きさ (最大 1GB) の xml ドキュメントを処理し、python で解析する必要があります。iterparse()関数 (SAX スタイルの解析)を使用しています。
私の懸念は次のとおりです。このようなxmlがあると想像してください
<?xml version="1.0" encoding="UTF-8" ?>
<families>
<family>
<name>Simpson</name>
<members>
<name>Homer</name>
<name>Marge</name>
<name>Bart</name>
</members>
</family>
<family>
<name>Griffin</name>
<members>
<name>Peter</name>
<name>Brian</name>
<name>Meg</name>
</members>
</family>
</families>
もちろん、問題は、私がいつ姓を取得するのか (シンプソンズとして)、いつその家族の一員の名前を取得するのか (たとえば、ホーマー) を知ることです。
私がこれまでやってきたことは、「メンバー」タグの中にいるかどうかを教えてくれる「スイッチ」を使用することです。コードは次のようになります
import xml.etree.cElementTree as ET
__author__ = 'moriano'
file_path = "test.xml"
context = ET.iterparse(file_path, events=("start", "end"))
# turn it into an iterator
context = iter(context)
on_members_tag = False
for event, elem in context:
tag = elem.tag
value = elem.text
if value :
value = value.encode('utf-8').strip()
if event == 'start' :
if tag == "members" :
on_members_tag = True
elif tag == 'name' :
if on_members_tag :
print "The member of the family is %s" % value
else :
print "The family is %s " % value
if event == 'end' and tag =='members' :
on_members_tag = False
elem.clear()
そして、これは出力が
The family is Simpson
The member of the family is Homer
The member of the family is Marge
The member of the family is Bart
The family is Griffin
The member of the family is Peter
The member of the family is Brian
The member of the family is Meg
私の懸念は、この(単純な)例では、どのタグ(on_members_tag)であるかを知るために追加の変数を作成する必要があったことです。処理する必要がある真のxmlの例を想像してみてください。それらには、より多くのネストされたタグがあります。
また、これは非常に縮小された例であるため、より多くのタグ、より多くの内部タグを含む xml に直面し、さまざまなタグ名、属性などを取得しようとしている可能性があると想定できます。
それで質問です。私はここでひどく愚かなことをしていますか?これにはもっとエレガントな解決策が必要だと思います。