2014-11-04 68 views
2

xmltodict将XML转换为Python字典。它支持命名空间。我可以按照主页上的示例并成功删除名称空间。但是,我无法从我的XML中删除命名空间,并且无法确定原因?下面是我的XML:用Python中的xmltodict删除名称空间

<?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> 

而且使用:

xmltodict.parse(xml,process_namespaces=True,namespaces={'http://localhost/mystatus':None}) 

我得到:的

OrderedDict([(u'status', OrderedDict([(u'section1', OrderedDict([(u'@http://localhost/mystatus:field1', u'data1'), (u'@http://localhost/mystatus:field2', u'data2')])), (u'section2', OrderedDict([(u'@http://localhost/mystatus:lineA', u'outputA'), (u'@http://localhost/mystatus:lineB', u'outputB')]))]))]) 

代替:

OrderedDict([(u'status', OrderedDict([(u'section1', OrderedDict([(u'field1', u'data1'), (u'field2', u'data2')])), (u'section2', OrderedDict([(u'lineA', u'outputA'), (u'@lineB', u'outputB')]))]))]) 

我是不是做一些简单的错误,或有什么关于我的XML阻止process_na间距修改工作正常吗?

回答

2

xmltodict基于expat,所以命名空间应适用于类名,而不是属性名:

foo = xmltodict.parse(xml, 
         process_namespaces=True, 
         namespaces={'http://localhost/mystatus':None}) 

输出:

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

当解析

OrderedDict([(u'status', OrderedDict([(u'section1', OrderedDict([(u'@field1', u'data1'), (u'@field2', u'data2')])), (u'section2', OrderedDict([(u'@lineA', u'outputA'), (u'@lineB', u'outputB')]))]))]) 

访问它很容易:

当你有多个名称相同的属性个
# Get attribute 'lineA' from class 'section2' from class 'status' 
>>> foo.get('status').get('section2').get('@lineA') 
u'outputA' 

属性命名空间只需要(例如多个ID或多个价格等),在这种情况下,我无法得到expatxmltodict正确解析它。 YMMV。

+0

我不控制XML源代码,这是否意味着我运气不好,让xmltodict按照我想要的方式工作?如果是这样,你能推荐从我展示的XML开始的最佳方法吗? – proximous 2014-11-04 04:18:40

+0

听起来像它。我对名称空间方面的专家不够肯定。最终,您总是可以使用完整的名称空间提取键,或者编写一些函数,在解析xmltodict树后自己从键中删除http:// * /前缀。 – VooDooNOFX 2014-11-05 01:54:46

+0

谢谢。由于我的XML作为一个字符串开始,我只是在解析之前从字符串中提取它。不理想,但现在我明白了为什么它不起作用,通过字符串操作来改变它并没有错。 :) – proximous 2014-11-06 12:27:21