如果您认为正则表达式比这更简单,那么我心爱的SD Chargers帽子就不适合您使用:
#!/usr/bin/env pythonimport xml.etree.cElementTree as etsxml="""<encspot> <file> <Name>some filename.mp3</Name> <Enprer>Gogo (after 3.0)</Enprer> <Bitrate>131</Bitrate> </file> <file> <Name>another filename.mp3</Name> <Enprer>iTunes</Enprer> <Bitrate>128</Bitrate> </file></encspot>"""tree=et.fromstring(sxml)for el in tree.findall('file'): print '-------------------' for ch in el.getchildren(): print '{:>15}: {:<30}'.format(ch.tag, ch.text)print "nan alternate way:" el=tree.find('file[2]/Name') # xpathprint '{:>15}: {:<30}'.format(el.tag, el.text)
输出:
-------------------Name: some filename.mp3 Enprer: Gogo (after 3.0)Bitrate: 131 -------------------Name: another filename.mp3 Enprer: iTunes Bitrate: 128an alternate way:Name: another filename.mp3
如果您对正则表达式的吸引力不那么强,那么下面的列表理解功能同样令人难以理解,可以创建数据结构:
[(ch.tag,ch.text) for e in tree.findall('file') for ch in e.getchildren()]
它
<file>以文档顺序创建XML子级的元组列表:
[('Name', 'some filename.mp3'), ('Enprer', 'Gogo (after 3.0)'), ('Bitrate', '131'), ('Name', 'another filename.mp3'), ('Enprer', 'iTunes'), ('Bitrate', '128')]
显然,只要多花点时间,再多加一点考虑,就可以使用ElementTree从XML创建所需的任何数据结构。它是Python发行版的一部分。
编辑
高尔夫代码开了!
[{item.tag: item.text for item in ch} for ch in tree.findall('file')] [ {'Bitrate': '131', 'Name': 'some filename.mp3', 'Enprer': 'Gogo (after 3.0)'}, {'Bitrate': '128', 'Name': 'another filename.mp3', 'Enprer': 'iTunes'}]
如果您的XML仅包含该
file部分,则可以选择您的高尔夫。如果您的XML有其他标签,其他部分,则需要说明孩子所在的部分,并且需要使用
findall
在Effbot.org上有关于ElementTree的教程。