2014-10-31 73 views
3

StackOverflow似乎有很多解決方案將XML轉換爲Python字典,但它們都不會生成我正在尋找的輸出。我有以下XML:使用lxml將XML轉換爲Python字典

<?xml version="1.0" encoding="UTF-8"?> 
<status xmlns:mystatus="http://localhost/mystatus"> 
<section1 
    mystatus:field1="data1" 
    mystatus:field2="data2" /> 
<section2 
    mystatus:lineA="outputA" 
    mystatus:lineB="outputB" /> 
</status> 

lxml has an elegantly simple solution轉換XML字典:

def recursive_dict(element): 
return element.tag, dict(map(recursive_dict, element)) or element.text 

不幸的是,我得到:

('status', {'section2': None, 'section1': None}) 

代替:

('status', {'section2': 
         {'field1':'data1','field2':'data2'}, 
      'section1': 
         {'lineA':'outputA','lineB':'outputB'} 
      }) 

我不能想象e出了如何獲得我想要的輸出,而不會使recursive_dict()函數複雜化。

我沒有綁定到lxml,並且我也可以使用字典的不同組織,只要它能夠提供我在xml中的所有信息即可。謝謝!

+0

出於好奇,您爲什麼期望獲得段的屬性,而不是狀態的屬性?什麼魔法讓圖書館知道你想要什麼?還有...部分內容是屬性而不是元素的原因是什麼? – GreenAsJade 2014-10-31 02:01:20

+0

XML來自我無法控制的來源。我需要能夠消費並採取行動。這就是爲什麼我說我會對詞典的另一個組織「很好」。我的目標是將所有的信息 - 無論是標籤,文本,屬性等 - 都變成一個簡單的結構,如字典。沒有「魔力」需要。 「無」的值是好的。我只想要捕獲XML中的所有信息。 – proximous 2014-10-31 03:50:02

+0

這聽起來像你有一個解決方案,但我只是想指出,你顯示的所需輸出並不顯示_ALL_捕獲的信息。它顯示捕獲的部分的屬性,但不顯示狀態的屬性。 – GreenAsJade 2014-10-31 04:11:36

回答

9

我個人喜歡xmltodicthere。在linux上,您可以使用pip install xmltodict進行安裝。

請注意,這實際上創建了OrderedDict對象。用法示例:

import xmltodict as xd 

with open('test.xml','r') as f: 
    d = xd.parse(f) 
+0

雖然我寧願不需要額外安裝任何東西,但這很簡單,看起來好像會起作用,所以我會試一試。謝謝! – proximous 2014-10-31 03:58:32

+0

這很好用!我更喜歡在解析後用d = ast.literal_eval(json.dumps(d))重新格式化它,但默認輸出保留了對我來說完美的一切!謝謝! – proximous 2014-10-31 05:11:26

+1

使用大xml時請注意xmltodict。 xmltodict正在使用標準庫中的python xml模塊。當xml> 1 GB時它變得非常慢。而是使用lxml – AlexanderLedovsky 2016-04-25 10:29:13