Python XML解析 - 对齐索引元素
问题描述:
我急需一些解析XML文件的帮助。我一直在旋转我的*几个星期,并没有取得很大的进展。我有下面的XML片段,并试图创建一个名称和值的列。问题是,有些名称被索引并导致对齐问题,当我并排打印它们时。Python 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])
希望它有帮助!
感谢您关注此事。虽然这并没有完全达到我所期望的目标,但它确实帮助/指导我将非索引值的名称和值对齐。我将继续寻找索引值的解决方案。谢谢。 – MBasith