xmltodict.unparse没有正确处理CDATA

时间:2016-01-29 16:20:31

标签: 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相同。但是,在输入中节点是不同的。

此致

1 个答案:

答案 0 :(得分:0)

我终于设法通过执行这个猴子补丁来实现它。我对它仍然不是很满意,这真的是一个'黑客'这个功能应该被妥善包含在某个地方:

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

此致