python xml2dict 复杂 xml
python xml2dict complex xml
我有一个巨大而复杂的 xml 文档,我想将其解析为字典(然后使用 sqlalchemy 解析为数据库)。我想使用 xmltodict 来完成这项任务。
但是,xmltodict 似乎不能直接解析深度嵌套的[=31=]。
我的 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')]))]))]))])
这是有意为之,因为可能存在内存问题吗?有更优雅的解决方法吗?
您在行不通的行中遗漏了结束符 )。
我使用了 python 3.5,复制了您的文件但添加了结尾 ) 并将 ESCIDOC_test.xml 更改为 test.xml。 运行 它和所有 3 个打印语句都正常工作(没有 TypeError)。
我有一个巨大而复杂的 xml 文档,我想将其解析为字典(然后使用 sqlalchemy 解析为数据库)。我想使用 xmltodict 来完成这项任务。
但是,xmltodict 似乎不能直接解析深度嵌套的[=31=]。
我的 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')]))]))]))])
这是有意为之,因为可能存在内存问题吗?有更优雅的解决方法吗?
您在行不通的行中遗漏了结束符 )。
我使用了 python 3.5,复制了您的文件但添加了结尾 ) 并将 ESCIDOC_test.xml 更改为 test.xml。 运行 它和所有 3 个打印语句都正常工作(没有 TypeError)。