24

十分な大きさ (最大 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 に直面し、さまざまなタグ名、属性などを取得しようとしている可能性があると想定できます。

それで質問です。私はここでひどく愚かなことをしていますか?これにはもっとエレガントな解決策が必要だと思います。

4

2 に答える 2