我正在使用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>
答案 0 :(得分:2)
重写XML解析代码的一种方法如下。在这里我定义了一个生成器,它循环遍历根元素的所有CD
元素(我不检查这是一个CATALOG
元素,尽管你可以添加该检查)。此生成器将每个CD
元素的所有子元素作为字典返回。
使用生成器比构建所有CD
元素的字典更有效,特别是如果您的XML文件非常大,因为您只在内存中存储了一个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.'
答案 1 :(得分:1)
未测试:
....
for CD in tree.findall('cd'):
for node in CD.finditer():
print node.tag # TITLE, ARTIST, PRICE etc.
.....