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

标签 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 修改的正常工作?

最佳答案

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。

关于python - 在 Python 中使用 xmltodict 删除命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26726728/

相关文章:

python - 为什么 Python 返回 [15] for [0xfor x in (1, 2, 3)]?

python - 为什么多重赋值和单一赋值在 python 中表现不同

python - Python 数组中 1 和 0 的组合

java - 使用 "P"重命名节点名称,并将属性添加为旧名称

android - 抽屉导航

java - 从 2000 行文件中提取数据的 Java XML 解析器(在移动设备上)

c# - 简单数据结构的最轻序列化方法

python - TypedDict 的默认值

python - 为什么在 for 循环中将单词从复数转换为单数需要这么长时间 (Python 3)?

java - 在 Java 中使用拉解析器一次读取一个节点的大型 xml 文件?