Разобрать тяжелый XML в упорядоченный словарь - PullRequest
0 голосов
/ 08 марта 2019

В настоящее время я работаю над анализом XML в Python 3.x для размера XML до 300 МБ, не сталкиваясь с какими-либо проблемами с приведенным ниже кодом.Однако, когда размер файла увеличивается до 500 МБ или в ГБ, возникают проблемы с памятью.

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 для разбора вышеупомянутого XML в упорядоченном dict.

...