Python中基于元素树的XML解析

Python中基于元素树的XML解析,python,xml,elementtree,Python,Xml,Elementtree,我正在使用Python和ElementTree来解析XML文件。我希望能够制作一个包含所有CD信息的词典列表。我可以稍后使用此列表来收集信息,例如显示来自美国的CD的标题。下面的代码正常工作,但如果年份标记不是CD的最后一个标记,则很容易被破坏。我如何重写这段代码,使标记可以按任何顺序排列 from xml.etree.ElementTree import ElementTree f = open("cd_catalog.xml") tree = ElementTree() tree.pars

我正在使用Python和ElementTree来解析XML文件。我希望能够制作一个包含所有CD信息的词典列表。我可以稍后使用此列表来收集信息,例如显示来自美国的CD的标题。下面的代码正常工作,但如果
年份
标记不是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>

皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
隐藏你的心
邦尼泰勒
英国
哥伦比亚唱片公司
9.90
1988
未经测试:

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

.....
未经测试:

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

.....

重写XML解析代码的一种方法如下。在本文中,我定义了一个生成器,它在根元素的所有
CD
元素上循环(我不检查这是否是
CATALOG
元素,尽管您可以添加该签入)。此生成器将每个
CD
元素的所有子元素作为字典返回

使用生成器比构建包含所有
CD
元素的字典效率更高,尤其是当XML文件非常大时,因为您只在内存中存储单个
CD
元素

将xml.etree.ElementTree导入为etree
def get_cd(元件):
尝试:
对于元素中的el.iter(tag='CD')
收益率获取cd信息(el)
除属性错误外:
#Python<2.7
对于element.getiterator(tag='CD')中的el
收益率获取cd信息(el)
def get_cd_信息(元素):
返回{'title':element.findtext('title'),
“艺术家”:元素.findtext(“艺术家”),
“国家”:元素.findtext(“国家”),
“公司”:element.findtext(“公司”),
“价格”:element.findtext(“价格”),
'year':element.findtext('year')}
以下是上述方法的作用:

s=''
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
隐藏你的心
邦尼泰勒
英国
哥伦比亚唱片公司
9.90
1988
'''
e=etree.fromstring(s)
对于get_cd(e)中的cd:
如果cd['country']=='USA':
打印('cd“{0}”来自美国。'。格式(cd['title']))
#“帝国滑稽剧”的cd来自美国

重写XML解析代码的一种方法如下。在本文中,我定义了一个生成器,它在根元素的所有
CD
元素上循环(我不检查这是否是
CATALOG
元素,尽管您可以添加该签入)。此生成器将每个
CD
元素的所有子元素作为字典返回

使用生成器比构建包含所有
CD
元素的字典效率更高,尤其是当XML文件非常大时,因为您只在内存中存储单个
CD
元素

将xml.etree.ElementTree导入为etree
def get_cd(元件):
尝试:
对于元素中的el.iter(tag='CD')
收益率获取cd信息(el)
除属性错误外:
#Python<2.7
对于element.getiterator(tag='CD')中的el
收益率获取cd信息(el)
def get_cd_信息(元素):
返回{'title':element.findtext('title'),
“艺术家”:元素.findtext(“艺术家”),
“国家”:元素.findtext(“国家”),
“公司”:element.findtext(“公司”),
“价格”:element.findtext(“价格”),
'year':element.findtext('year')}
以下是上述方法的作用:

s=''
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
隐藏你的心
邦尼泰勒
英国
哥伦比亚唱片公司
9.90
1988
'''
e=etree.fromstring(s)
对于get_cd(e)中的cd:
如果cd['country']=='USA':
打印('cd“{0}”来自美国。'。格式(cd['title']))
#“帝国滑稽剧”的cd来自美国