python - 将重 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 的方法。
解决方案
推荐阅读
- python - 在 Python 中显示表格
- mysql - Mysql Trim 不适用于特定列的所有值
- reactjs - 使用 React 测试库提交后测试重定向
- android - Webview弹出窗口故障
- javascript - 通过减小字体大小使文本适合固定高度和固定宽度的 div
- nginx - Kubernetes Nginx 许多小 pod 与每个节点一个 pod
- ruby-on-rails - rails test 调用了错误的同名控制器
- embedded-jetty - 推送命令后的 GitServlet 密码查询
- linux - kubernetes:Docker 请求和分配的内容之间的区别
- angular - Angular 和 WebApi2.2 JSON 解析的噩梦问题