如果您认为正则表达式比这更简单,那么我心爱的SD Chargers帽子就不适合您使用:
#!/usr/bin/env python
import xml.etree.cElementTree as et
sxml="""
<encspot>
<file>
<Name>some filename.mp3</Name>
<Encoder>Gogo (after 3.0)</Encoder>
<Bitrate>131</Bitrate>
</file>
<file>
<Name>another filename.mp3</Name>
<Encoder>iTunes</Encoder>
<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') # xpath
print '{:>15}: {:<30}'.format(el.tag, el.text)
输出:
-------------------
Name: some filename.mp3
Encoder: Gogo (after 3.0)
Bitrate: 131
-------------------
Name: another filename.mp3
Encoder: iTunes
Bitrate: 128
an alternate way:
Name: another filename.mp3
如果您对正则表达式的吸引力不那么强,那么下面的列表理解功能同样令人难以理解,可以创建数据结构:
[(ch.tag,ch.text) for e in tree.findall('file') for ch in e.getchildren()]
[('Name', 'some filename.mp3'),
('Encoder', 'Gogo (after 3.0)'),
('Bitrate', '131'),
('Name', 'another filename.mp3'),
('Encoder', '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',
'Encoder': 'Gogo (after 3.0)'},
{'Bitrate': '128',
'Name': 'another filename.mp3',
'Encoder': 'iTunes'}]
如果您的XML仅包含该file
部分,则可以选择您的高尔夫。如果您的XML有其他标签,其他部分,则需要说明孩子所在的部分,并且需要使用findall
在Effbot.org上有关于ElementTree的教程。