我有一个看起来像这样的xml文件,但只有更多的托管对象:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
<cmData type="actual">
<header>
<log dateTime="2017-02-04T12:17:29" action="created" appInfo="ActualExporter">InternalValues are used</log>
</header>
<managedObject class="C" version="R1" KName="PP-1" id="269">
<p name="aC">0</p>
<p name="bC">3</p>
<p name="cC">2</p>
<list name="dC">
<item>
<p name="eC">2</p>
<p name="fC">2</p>
</item>
<item>
<p name="gC">14</p>
<p name="hC">45</p>
</item>
<p name="iC">5</p>
<p name="jC">15</p>
</managedObject>
<managedObject class="C" version="R1" KName="PP-2" id="270">
<p name="aC">23</p>
<p name="bC">2</p>
<p name="cC">2</p>
<list name="dC">
<item>
<p name="eC">2</p>
<p name="fC">3</p>
</item>
<item>
<p name="gC">14</p>
<p name="hC">54</p>
</item>
<p name="iC">5</p>
<p name="jC">15</p>
</managedObject>
</cmData>
</raml>
我将这个xml解析为字典的方式让我可以相互比较参数值:
import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('my_xml.xml').getroot()
temp_C = []
for atype in list(e):
for i in list(atype):
if i.get('class') == 'C':
temp_C.append(i)
temp = []
for i in temp_C:
for j, k in zip(list(i), i):
temp.append([i.get('KName'), j.get('name'), j.text])
tempdict = {}
for i in temp_C:
td = {}
for j in list(i):
td.update({j.get('name'): j.text})
tempdict.update({i.get('KName'): td})
for j in list(i):
td.update({j.get('name'): j.text})
#Next part of code it's part where problem is:
if j.get('name') == 'dC':
elementi_itema = []
for item in list(j):
lista_name = {}
for w in list(item):
lista_name.update({w.get('name'): w.text})
elementi_itema.append(lista_name)
td.update({'dC': elementi_itema})
tempdict.update({i.get('KName'): td})
这完全有效,将列表值放在某些python列表中,这是内部字典中“dC”键的值,但问题是我在其他xmls中有另一个列表名称或者在同一个xml中有更多不同的列表,而不是总是“dC”,所以我需要一些通用的解决方案,它将在xml树中的每个列表上工作,而不依赖于列表名称。