Python中的XML处理
我正在准备做一个项目,需要用Python构建并发送一个XML文档到一个网络服务。我想通过这个过程来提升自己的Python技能。
不过,虽然我对.NET中的XML模型比较了解,但我对Python中的XML模型的优缺点还不太清楚。
有没有人有在Python中处理XML的经验?你们建议我从哪里开始呢?我将要构建的XML文件会比较简单。
12 个回答
处理XML文件主要有三种方法:DOM、SAX和XPath。DOM模型适合那些可以一次性把整个XML文件加载到内存中的情况,如果你不介意处理数据结构,并且需要查看大部分或全部数据的话,使用DOM就很合适。SAX模型则适合只关注几个标签,或者处理大文件并且可以逐步处理的情况。XPath模型则是两者的结合——你可以选择需要的数据路径,但使用起来需要更多的库。
如果你想要简单易用的Python解决方案,minidom是个选择,但它其实不太好用,文档也很糟糕,基本上就是“这是DOM的文档,自己去研究吧”。这让人很烦。
我个人比较喜欢cElementTree,它是ElementTree的一个更快的实现,类似于DOM模型。
我用过SAX系统,从某种程度上来说,它们的感觉更“Python风格”,但我通常会创建基于状态的系统来处理这些,这样就容易出问题(和bug)。
我建议如果你喜欢研究,就用minidom;如果你想要好用的代码,就用ElementTree。
ElementTree 是一个很不错的 Python 库,提供了简单易用的接口。我记得它甚至是 Python 2.5 的一部分。
这个库是用纯 Python 写的,正如我所说的,非常好用。不过,如果你发现需要更高的性能,那么可以考虑 lxml。它提供了相同的接口,并且在后台使用了 libxml2。理论上,当你发现需要更快的处理速度时,可以直接把它替换上去。
我个人在一个涉及很多XML的项目中尝试了几种内置选项,最后选择了pulldom,觉得它最适合处理不太复杂的文档。
特别是对于一些小的简单内容,我更喜欢事件驱动的解析方式,而不是为了一个相对简单的结构设置一大堆回调函数。这里有个不错的简短讨论,讲解了如何使用这个API。
我喜欢的地方是:你可以在一个for
循环中处理解析,而不是使用回调函数。你还可以延迟完整解析(也就是“拉取”部分),只有在调用expandNode()
时才获取更多细节。这满足了我对“负责任”的效率的基本要求,同时又不牺牲易用性和简单性。