将繁重的XML解析为有序字典

2024-10-04 03:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在Python3.x中解析XML,XML大小一直到300MB,下面的代码没有任何问题。但是,当文件大小增加到500MB或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循环生成的输出保存在有序字典中。dict的所有条目都附加在列表的末尾。 正在寻找使用iterparse方法在有序dict中解析上述XML的方法


Tags: nameindfforxmlclassname2dict2