我迫切需要一些解析xml文件的帮助。我已经忙了几个星期了,但没有多大进展。我有下面的XML片段,并试图创建一个列的名称和值。问题是有些名字被索引了,当我并排打印它们时,会导致对齐问题。
你能帮助或指导我解析这个XML并得到所需的打印吗?理想情况下,我希望不使用lxml,因为系统没有这个模块,但也不介意使用lxml的建议。
XML文件示例:
<root>
<elments>
<mgmtid>
<date>20160926</date>
<gp>3600</gp>
<name p="">watermelons</name>
<name p="">bananas</name>
<name p="">oranges</name>
<valuegroup>
<objid>None</objid>
<value p="">10</value>
<value p="">15</value>
<value p="">20</value>
</valuegroup>
</mgmtid>
<mgmtid>
<date>20160926</date>
<gp>3600</gp>
<name p="">apples</name>
<valuegroup>
<objid>red</objid>
<value p="">100</value>
</valuegroup>
<valuegroup>
<objid>blue</objid>
<value p="">200</value>
</valuegroup>
<valuegroup>
<objid>yellow</objid>
<value p="">300</value>
</valuegroup>
<valuegroup>
<objid>white</objid>
<value p="">400</value>
</valuegroup>
<valuegroup>
<objid>green</objid>
<value p="">500</value>
</valuegroup>
</mgmtid>
<mgmtid>
<date>20160926</date>
<gp>3600</gp>
<name p="">strawberry</name>
<name p="">guava</name>
<valuegroup>
<objid>None</objid>
<value p="">650</value>
<value p="">750</value>
</valuegroup>
</mgmtid>
</elments>
</root>
我尝试(悲惨地失败了)获取名称和值。如您所见,这些值并没有与其名称对齐。
import xml.etree.ElementTree as ET
import itertools
import collections
tree = ET.parse('test_xml_file.xml')
root = tree.getroot()
names = []
values = []
for i in (tree.findall('.//')):
if i.tag == 'name':
n = (i.tag, i.text)
names.append(n[0] + ' ' + str(n[1]))
for i in (tree.findall('.//')):
if i.tag == 'value' or i.tag == 'objid':
v = (i.tag, i.text)
values.append(v[0] + ' ' + str(v[1]))
print('=' * 45)
for n, v in itertools.zip_longest(names, values):
print(str(n).ljust(20, ' ') + str(v))
当前输出:name watermelons objid None
name bananas value 10
name oranges value 15
name apples value 20
name strawberry objid red
name guava value 100
None objid blue
None value 200
None objid yellow
None value 300
None objid white
None value 400
None objid green
None value 500
None objid None
None value 650
None value 750
所需输出:=============================
name Index value
=============================
watermelons None 10
bananas None 15
oranges None 20
apples red 100
apples blue 200
apples yellow 300
apples white 400
apples green 500
strawberry None 650
guava None 750
我没有看到一个快速和花哨的方法来解决它,这段代码工作:
import xml.etree.ElementTree as ET
tree = ET.parse('test_xml_file.xml')
elements = []
mgmtids = tree.getroot().findall(".//mgmtid")
for mgmtid in mgmtids:
names = mgmtid.findall(".//name")
objids = mgmtid.findall(".//valuegroup/objid")
values = mgmtid.findall(".//valuegroup/value")
if len(names) == len(values):
for i in range(len(names)):
elements.append([names[i].text,objids[0].text,values[i].text])
elif len(objids)==len(values):
for i in range(len(values)):
elements.append([names[0].text,objids[i].text,values[i].text])
elif len(names) == len(objids):
for i in range(len(names)):
elements.append([names[i].text,objids[i].text,values[0].text])
#elements.append([names[i].text,objids[i].text,values[i].text for i in len(names)])
print "n".join([" - ".join([text for text in el]) for el in elements])
希望有帮助!