通过XML列表使用Python并转换为dict

通过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文件,但更多的是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-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})