python - xmltodict.unparse 未正确处理 CDATA

标签 python xmltodict

我正在尝试使用 xmltodict 将 XML 内容作为 python 对象进行操作,但我面临着正确处理 CDATA 的问题。我想我在某处遗漏了一些东西,这是我的代码:

import xmltodict

data = """<node1>
    <node2 id='test'><![CDATA[test]]></node2>
    <node3 id='test'>test</node3>
</node1>"""

data = xmltodict.parse(data,force_cdata=True, encoding='utf-8')
print data

print xmltodict.unparse(data, pretty=True)  

这是输出:
OrderedDict([(u'node1', OrderedDict([(u'node2', OrderedDict([(u'@id', u'test'), ('#text', u'test')])), (u'node3', OrderedDict([(u'@id', u'test'), ('#text', u'test')]))]))])
<?xml version="1.0" encoding="utf-8"?>
<node1>
        <node2 id="test">test</node2>
        <node3 id="test">test</node3>
</node1>

我们在这里可以看到生成的 node2 中缺少 CDATA,并且 node2 与 node3 相同。但是,在输入中,节点是不同的。

问候

最佳答案

我终于通过执行这个猴子补丁设法让它工作。我对它仍然不是很满意,这真的是一个“黑客”,这个功能应该正确地包含在某个地方:

import xmltodict
def escape_hacked(data, entities={}):
    if data[0] == '<' and  data.strip()[-1] == '>':
        return '<![CDATA[%s]]>' % data

    return escape_orig(data, entities)


xml.sax.saxutils.escape = escape_hacked

然后正常运行你的python代码:
data = """<node1>
    <node2 id='test'><![CDATA[test]]></node2>
    <node3 id='test'>test</node3>
</node1>"""

data = xmltodict.parse(data,force_cdata=True, encoding='utf-8')
print data

print xmltodict.unparse(data, pretty=True) 

为了解释一下,以下行检测数据是否是有效的 XML,然后在它周围添加 CDATA 标记:
    if data[0] == '<' and  data.strip()[-1] == '>':
        return '<![CDATA[%s]]>' % data

问候

关于python - xmltodict.unparse 未正确处理 CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089171/

相关文章:

python - 阅读,修改 xml 使用 python 将其保存在新的 xml 中

python - 使用有序字典解析 xml 文件

具有自动完成机制解析文档字符串的 Python IDE

python - 什么决定了 Pandas 的最小和最大时间戳?

python - 如何在 selenium python 中的相对 css 选择器中使用父选择器

python - Flask Api 解析返回错误的 xml post 请求

Python 3 : Unable to convert XML to dict using xmltodict

python - Pandas 数据框过滤多个条件

python - 在 python 中输入 Callable 到特定方法

python - 如何使用 xmltodict 从 xml 文件中获取项目