2

ElementTree findall()を使用して、特定のタグを持つXML内の要素を検索しています。結果をリストにしたいと思います。現在、要素を繰り返し処理し、各要素の.textを選択して、リストに追加しています。これを行うには、もっとエレガントな方法があると確信しています。

#!/usr/bin/python2.7
#
from xml.etree import ElementTree
import os
myXML = '''<root>
<project project_name="my_big_project">
<event name="my_first_event">
<location>London</location>
<location>Dublin</location>
<location>New York</location>
<month>January</month>
<year>2013</year>
</event>
</project>
</root>
'''

tree = ElementTree.fromstring(myXML)
for node in tree.findall('.//project'):
  for element in node.findall('event'):
    event_name=element.attrib.get('name')
    print event_name
    locations = []
    if element.find('location') is not None:
      for events in element.findall('location'):
        locations.append(events.text)
# Could I use something like this instead?
#      locations.append(''.join.text(*events) for events in element.findall('location'))

print locations

これを出力します(これは正しいですが、可能であれば、findall()の結果をテキスト形式でリストに直接割り当てたいと思います。

my_first_event
['London', 'Dublin', 'New York']
4

1 に答える 1

1

これを試すことができます-リスト内包表記を使用して、空のリストを作成してから追加することなくリストを生成します。

if element.find('location') is not None:
  locations = [events.text for events in element.findall('location')]

locationsこれにより、上記の定義を取り除くこともできるため、コードは次のようになります。

tree = ElementTree.fromstring(myXML)
for node in tree.findall('.//project'):
  for element in node.findall('event'):
    event_name=element.attrib.get('name')
    print event_name
    if element.find('location') is not None:
      locations = [events.text for events in element.findall('location')]

print locations

注意が必要なことの 1 つは、場所で何をしているのかということです。場所がlocation存在しない場合は定義されないため、NameError印刷しようとしても場所が存在しない場合は が返されます。それが問題である場合は、定義を保持できますlocations = []。一致する要素が見つからない場合、結果は空のリストになります。

于 2012-11-19T18:42:42.427 に答える