在Python中使用xmltodict删除命名空间

时间:2014-11-04 02:23:09

标签: python xml

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

<?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_namespace修改才能正常工作?

1 个答案:

答案 0 :(得分:2)

xmltodict基于expat,因此名称空间应该应用于类名,而不是属性名称:

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

解析时:

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

输出:

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虽然。