博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python标准库xml.etree.ElementTree的bug
阅读量:6186 次
发布时间:2019-06-21

本文共 1008 字,大约阅读时间需要 3 分钟。

使用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 treedef 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字符集定义如下:

转载于:https://www.cnblogs.com/Jerryshome/p/3285171.html

你可能感兴趣的文章
Java,Jsp获取客户端IP地址
查看>>
100-88
查看>>
android4.0.3 编译lichee 报错dhd-cdc-sdmmc-gpl-3.0.8问题
查看>>
crc16 - 产生Modbus RTU格式的CRC码
查看>>
招聘又来了,这次推荐有奖哦
查看>>
我的友情链接
查看>>
Linux下ssh秘钥方式登录远程服务器
查看>>
golang test测试使用
查看>>
【Apache学习】编译安装httpd2.4 含傻瓜版自动安装脚本
查看>>
Python classmethod(类方法) 和 类属性 静态方法(缺少)
查看>>
我的友情链接
查看>>
vsftpd的基于pam_mysql的虚拟用户配置示例
查看>>
C语言中运算符的优先级排序
查看>>
nodejs tutorial - 5 单元测试 2015-3-24
查看>>
ubuntu下未获得锁问题
查看>>
我的友情链接
查看>>
前端面试题整理
查看>>
Azure上的Web Apps极其相关服务
查看>>
HP iLo licenses
查看>>
IIS7.5中asp.net 区域 area中的路径 URLRewriter报错 .. 在顶级目录上退出
查看>>