在elementtree中使用SimpleXMLTreeBuilder

7 投票
5 回答
14428 浏览
提问于 2025-04-15 12:36

我正在用django和elementtree开发一个应用程序,当我把它部署到生产服务器时,发现服务器上运行的是Python 2.4。我已经成功打包了elementtree,但现在遇到了一个错误:

"No module named expat; use SimpleXMLTreeBuilder instead"

很不幸,我无法升级Python,所以我只能使用现在这个版本。我该如何使用SimpleXMLTreeBuilder作为解析器?或者我需要重写代码吗?

5 个回答

0

从 elementtree 导入 SimpleXMLTreeBuilder 作为 XMLTreeBuilder

好的,现在稍微有点变化:

Traceback (most recent call last):
  File "C:\Python26\tests\xml.py", line 12, in <module>
    doc = elementtree.ElementTree.parse("foo.xml")
  File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 908, in parse
    tree = parser_api.parse(source)
  File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 169, in parse
    parser = XMLTreeBuilder()
  File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 1165, in __init__
    "No module named expat; use SimpleXMLTreeBuilder instead"
ImportError: No module named expat; use SimpleXMLTreeBuilder instead

我觉得它是和旧版本的 Python 静态链接的。有没有简单的方法可以把 XML 解析器连接到 Python 2.6?有些库似乎只适用于旧版本的 Python 8(

1

我们在使用 CentOS 5.5 的 Python 版本 2.6.4 时遇到了同样的问题。

这个问题出现在 expat 类尝试加载 pyexpat 模块的时候,具体可以查看 /usr/lib64/python2.6/xml/parsers/expat.py。

我查看了 /usr/lib64/python2.6/lib-dynload/ 目录,发现里面没有 "pyexpat.so" 这个共享文件。不过,我在另一台没有问题的机器上看到了这个文件。

我对比了两台机器上的 Python 版本(用命令 yum list 'python*'),发现正常工作的那台机器是 Python 2.6.5。运行 'yum update python26' 后,问题就解决了。

如果这个方法对你不管用,想要一个简单粗暴的解决办法,你可以把这个 SO 文件复制到你的动态加载路径里。

7

如果你有一个第三方模块需要使用 ElementTree(而且它会依赖 XMLTreeBuilder),你可以把 ElementTree 的 XMLTreeBuilder 定义换成 SimpleXMLTreeBuilder 提供的版本,方法如下:

from xml.etree import ElementTree # part of python distribution
from elementtree import SimpleXMLTreeBuilder # part of your codebase
ElementTree.XMLTreeBuilder = SimpleXMLTreeBuilder.TreeBuilder

这样一来,每次调用 ElementTree 时,它都会使用 SimpleXMLTreeBuilder。

另外,你可以查看这个链接了解更多信息: http://groups.google.com/group/google-appengine/browse_thread/thread/b7399a91c9525c97

撰写回答