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

时间:2017-09-08 13:59:52

标签: python xml list dictionary

我有一个看起来像这样的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树中的每个列表上工作,而不依赖于列表名称。

0 个答案:

没有答案