通过XML列表使用Python并转换为dict
我有一个如下所示的xml文件,但更多的是managedObjects:通过XML列表使用Python并转换为dict,python,xml,list,dictionary,Python,Xml,List,Dictionary,我有一个如下所示的xml文件,但更多的是managedObjects: <?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
<?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>
这非常有效,将列表值放在一些python列表中,这是内部字典中“dC”键的值,但问题是我在其他xml中有另一个列表名称,或者在同一个xml中有更多不同的列表,而不总是“dC”,所以我需要一些通用解决方案来处理xml树中的每个列表,不取决于列表名称 为什么不在文件(
root.findall(“list”)
)中获取所有的
,并循环它们的所有子项?如果您想比较特定的值,您可以将代码生成一个函数,并将它们的名称设置为parameters@M.T我尝试过类似的方法,但它不起作用,我不确定我的错误在哪里。你能分享你尝试过的关于m.T建议的代码吗?为什么不把所有
都放在文件(root.findall(“列表”)中
)并在所有孩子身上循环?如果您想比较特定的值,您可以将代码生成一个函数,并将它们的名称设置为parameters@M.T我试过类似的方法,但不起作用,我不确定我的错误在哪里。你能分享一下你试过的关于m.T.建议的代码吗?
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})