2016-02-09 73 views
0

我有,我想解析爲一個字典(以及後來與SQLAlchemy的分貝)一個龐大而複雜的XML文檔。我想爲此任務使用xmltodict
然而,似乎xmltodict不能直接解析深度嵌套的XML。蟒蛇xml2dict複雜的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')]))]))]))]) 

這是打算,因爲可能的內存問題?有沒有更優雅的解決方法?

回答

2

你離開了就不起作用線收盤)。

我用蟒蛇3.5,複製文件,但補充收盤),改變ESCIDOC_test.xml到的test.xml。將它和所有3個打印語句正常工作(無TypeError)。

+0

根據這個答案是否正確(我沒有測試過我自己),這可能是最好的第一篇文章我已經審查。 –

+0

據官方消息:您的解決方案是正確的。這是我審查過的最好的第一篇文章。 –

+0

謝謝Greg。 – kevin