首页 > 解决方案 > 将重 XML 解析为有序字典

问题描述

我目前正致力于在 Python 3.x 中解析 XML,直到 300 MB 的 XML 大小没有遇到以下代码的任何问题。但是,当文件大小增加到 500 MB 或 GB 时,就会出现内存问题。

tree2=etree.parse(xmlfile2)
root2=tree2.getroot()
df_list2=[]
for i, child in enumerate(root2):
    for subchildren in (child.findall('{raml20.xsd}header')):
        for subchildren in (child.findall('{raml20.xsd}managedObject')):
            xml_class_name2 = subchildren.get('class')
            xml_dist_name2 = subchildren.get('distName')
            for subchild in subchildren:
                df_dict2=OrderedDict()
                header2=subchild.attrib.get('name')
                df_dict2['MOClass']=xml_class_name2
                df_dict2['CellDN']=xml_dist_name2
                df_dict2['Parameter']=header2
                df_dict2['CurrentValue']=subchild.text
                df_list2.append(df_dict2)

遇到各种解释使用“iterparse”的文章,但没有办法使用它以有序的方式保存 XML 数据。以下是我的 XML 格式:

<raml version="2.0" xmlns="raml20.xsd">
  <cmData type="plan" scope="all" name="XML_Plan_update.xml">
    <header>
      <log dateTime="2018-12-31T16:13:28" action="created" appInfo="PlanExporter"/>
    </header>
    <managedObject class="WNCEL" version="LN2.0" distName="PLMN-PLMN/MRBTS-137/WNBTS-1/WNCEL-27046" operation="update">
      <p name="defaultCarrier">10787</p>
      <p name="lCelwDN">MRBTS-137/MNL-1/MNLENT-1/CELLMAPPING-1/LCELW-4</p>
      <p name="maxCarrierPower">460</p>
    </managedObject>
    <managedObject class="WNCEL" version="LN2.0" distName="PLMN-PLMN/MRBTS-6770/WNBTS-1/WNCEL-26925" operation="update">
      <p name="defaultCarrier">10787</p>
      <p name="lCelwDN">MRBTS-6770/MNL-1/MNLENT-1/CELLMAPPING-1/LCELW-5</p>
      <p name="maxCarrierPower">460</p>
    </managedObject>
    <managedObject class="WNCEL" version="LN2.0" distName="PLMN-PLMN/MRBTS-806/WNBTS-1/WNCEL-22661" operation="update">
      <p name="defaultCarrier">10762</p>
      <p name="lCelwDN">MRBTS-806/MNL-1/MNLENT-1/CELLMAPPING-1/LCELW-9</p>
      <p name="maxCarrierPower">460</p>
    </managedObject>

我目前使用 cElementTree 或 lxml 来解析 XML 并将 for 循环生成的输出保存在 Ordered Dictionary 中。dict 的所有条目都附加在列表的末尾。寻找一种使用 iterparse 方法在有序字典中解析上述 XML 的方法。

标签: pythonpython-3.xxml-parsinglxmlelementtree

解决方案


推荐阅读