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

2024-05-15 17:44:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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>

并使用:

^{pr2}$

我得到:

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中有什么东西阻止了进程名称空间修改的正常工作?在


Tags: 名称localhosthttpstatus空间xmlordereddictfield2
1条回答
网友
1楼 · 发布于 2024-05-15 17:44:43

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>

分析时使用:

^{pr2}$

输出:

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或多个price等)时才需要属性名称空间,在这种情况下,我无法让expat或{}来正确解析它。但是YMMV。在

相关问题 更多 >