0

Python と ElementTree を使用して XML ファイルを解析しています。すべての CD の情報を含む辞書のリストを作成できるようにしたいと考えています。このリストは、後で情報を収集するために使用できます。たとえば、米国からの CD のタイトルを表示するなどです。YEAR以下のコードは機能していますが、タグが CD の最後のタグでない場合、簡単に壊れる可能性があります。タグが任意の順序になるように、このコードを書き直すにはどうすればよいですか?

from xml.etree.ElementTree import ElementTree

f = open("cd_catalog.xml")
tree = ElementTree()
tree.parse(f)

catalog = []
cd = {}
for node in tree.iter():
    if node.tag != "CD" and node.tag != "CATALOG":
        tagtext = (node.tag,node.text),
        cd.update(tagtext)
    if node.tag == "YEAR":
        catalog.append(cd)
        cd = {}

for cd in catalog:
    if cd["COUNTRY"] == "USA":
        print("The cd named {0} is from USA".format(cd["TITLE"]))

xml ファイルの 2 つのエントリ:

<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>1985</YEAR>
    </CD>
    <CD>
        <TITLE>Hide your heart</TITLE>
        <ARTIST>Bonnie Tyler</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>CBS Records</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1988</YEAR>
    </CD>
</CATALOG>
4

2 に答える 2

2

XML 解析コードを書き直す 1 つの方法は、次のとおりです。これCDで、ルート要素のすべての要素をループするジェネレーターを定義します (チェックインをCATALOG追加することはできますが、これが要素であることは確認しません)。このジェネレーターは、各要素のすべてのサブ要素をCD辞書として返します。

ジェネレーターを使用すると、すべての要素のディクショナリを構築するよりも効率的ですCD。特に XML ファイルが非常に大きい場合は、1 つの要素しかCDメモリに格納しないためです。

import xml.etree.ElementTree as etree

def get_cd(element):
    try:
        for el in element.iter(tag='CD')
            yield get_cd_info(el)
    except AttributeError:
        # Python < 2.7
        for el in element.getiterator(tag='CD')
            yield get_cd_info(el)

def get_cd_info(element):
    return {'title':element.findtext('TITLE'),
        'artist':element.findtext('ARTIST'),
        'country':element.findtext('COUNTRY'),
        'company':element.findtext('COMPANY'),
        'price':element.findtext('PRICE),
        'year':element.findtext('YEAR')}

上記のメソッドの動作は次のとおりです。

s = '''<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>1985</YEAR>
    </CD>
    <CD>
        <TITLE>Hide your heart</TITLE>
        <ARTIST>Bonnie Tyler</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>CBS Records</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1988</YEAR>
    </CD>
</CATALOG>
'''

e = etree.fromstring(s)

for cd in get_cd(e):
    if cd['country'] == 'USA':
        print('The cd "{0}" is from the USA.'.format(cd['title']))

# prints 'The cd "Empire Burlesque" is from the USA.'
于 2012-08-13T08:33:06.027 に答える
1

未テスト:

....
for CD in tree.findall('cd'):
   for node in CD.finditer():
       print node.tag # TITLE, ARTIST, PRICE etc.

.....
于 2012-08-13T04:25:37.133 に答える