2014-10-31 70 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