作者:冷向泽 | 来源:互联网 | 2024-11-26 15:57
本文探讨了在Python脚本中使用ElementTree和cElementTree进行XML解析时遇到的问题,特别是在不同版本的Python中,cElementTree可能引发的ParseError异常。
在编写用于解析XML文件的Python脚本时,可能会选择使用ElementTree或其C语言加速版cElementTree。然而,有时会遇到这样的情况:同样的代码片段在使用ElementTree时能够正常运行,而换成cElementTree后却无法工作,抛出错误。
例如,下面的代码片段在尝试从标准输入读取XML数据并使用cElementTree进行解析时,会在Python 3.2.2或3.1.4版本中引发cElementTree.ParseError: no element found: line 1, column 0的异常:
#!/usr/bin/python3
import sys
import xml.etree.cElementTree as ET
tree = ET.parse(sys.stdin)
当通过命令行向此脚本传递简单的XML标签时,如:echo "c" | ./xmltest.py
,上述错误就会出现。
值得注意的是,这段代码在Python 2.7.2中可以正常运行,但在Python 3.2.2或3.1.4中则会出现问题。这一现象表明,可能是Python 3.x系列中的某些变更导致了cElementTree的行为差异。
幸运的是,在Python 3.3中,这个问题得到了修复。对于那些需要在Python 3.2或更低版本中运行代码的开发者来说,可以通过将sys.stdin
转换为字节流来绕过这个限制:
import sys
import xml.etree.cElementTree as ET
sys.stdin = sys.stdin.detach()
tree = ET.parse(sys.stdin)
这一改动使得即使在较旧的Python版本中,也能成功使用cElementTree解析XML数据。