python xml2dict复杂的xml

时间:2016-02-09 11:22:06

标签: python xml xmltodict

我有一个庞大而复杂的xml文档,我想将其解析为字典(后来进入带有sqlalchemy的数据库)。我想用xmltodict来完成这项任务 但是,似乎xmltodict无法直接解析嵌套的xml。

我的MWE:

的test.xml

<?xml version="1.0" encoding="UTF-8"?>
<ns1:tag-1>
    <ns2:tag-2 attrib1="value" attrib2="value">
        <ns3:tag-3 attrib3="value">blabla</ns3:tag-3>
    </ns2:tag-2>
</ns1:tag-1>

test.py

import xmltodict as x2d
with open('ESCIDOC_test.xml', encoding='utf-8') as purein:
    doc = x2d.parse(purein.read())
print(doc['ns1:tag-1']['ns2:tag-2']['@attrib2'])  # works
print(doc['ns1:tag-1']['ns2:tag-2']['ns3:tag-3']['#text'] # does not work, TypeError
ns3tree = doc['ns1:tag-1']['ns2:tag-2']['ns3:tag-3'] 
print(ns3tree['#text'])  # works

为什么我需要先将它分配给一个新变量才能使它工作?无论如何整个xml都被解析了,不是吗?

print(doc)
# OrderedDict([('ns1:tag-1', OrderedDict([('ns2:tag-2', OrderedDict([('@attrib1', 'value'), ('@attrib2', 'value'), ('ns3:tag-3', OrderedDict([('@attrib3', 'value'), ('#text', 'blabla')]))]))]))])

这是因为可能存在内存问题吗?是否有更优雅的解决方法?

1 个答案:

答案 0 :(得分:2)

你在不起作用的行上省略了结束。

我使用了python 3.5,复制了你的文件但添加了结束)并将ESCIDOC_test.xml更改为test.xml。跑吧,所有3个打印语句都正常工作(没有TypeError)。