python标准库xml.etree.ElementTree的bug

使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些,毕竟是python2.5以后的标准库。
没想到的是python标准库中竟然存在这么一个低级的bug,简单来说就是某种情况下使用ElementTree序列化的xml数据竟然无法正常解析。仔细分析之后发现是因为charset的原因,但为何不在序列化的时候就做一些检测,进行相应提醒呢?也不至于出现自己序列化自己却不能正常解析的尴尬局面了吧?这点和lxml相比就差远了。
具体示例如下:

def test_lxml():
    from lxml import etree
    root = etree.Element('root')
    root.text = '123\x0c'
    s = etree.tostring(root)
    print 's = ', s
    tree = etree.fromstring(s)
    print tree
def test_elementtree():
    from xml.etree.ElementTree import tostring, fromstring, Element
    root = Element('root')
    root.text = '123\x0c'
    s = tostring(root)
    print 's = ', s
    tree = fromstring(s)
if __name__== '__main__':
    test_elementtree()
    # test_lxml()

同样的逻辑,如果使用ElementTree来实现的话出现错误如下:

如果使用lxml来实现的话错误提示如下:

可以很容易看出lxml在无效xml字符方面的处理更友善一些,能在赋值的时候就检测字符有效性,而ElementTree则允许用户赋值,并能顺利序列化,但却在解析数据的时候出现异常。
究其根源,是root.text = '123\x0c'赋值中存在无效xml字\x0c,合法xml字符集定义如下:http://www.w3.org/TR/2006/REC-xml-20060816/#charsets

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值