Python中的XML处理

时间:2020-03-05 18:37:20  来源:igfitidea点击:

我将要构建一个项目,该项目需要构造XML文档并将其发布到Web服务,并且我想用Python来完成它,以此来扩展我在其中的技能。

不幸的是,尽管我对.NET相当了解XML模型,但是我不确定Python中XML模型的优缺点。

任何人都有使用Python处理XML的经验吗?你会建议我从哪里开始?我将要构建的XML文件将非常简单。

解决方案:

深入Python一章。虽然不能保证会有多好。

就个人而言,我曾在一个XML繁重的项目中使用过多个内置选项,并已将pulldom定位为不太复杂的文档的最佳选择。

特别是对于简单的小东西,我喜欢事件驱动的解析理论,而不是为相对简单的结构设置整个回调系列。这是有关如何使用API​​的快速讨论。

我喜欢的是:我们可以在for循环中处理解析,而不必使用回调。我们还会延迟完整解析("拉"部分),并且仅在调用expandNode()时获得更多详细信息。这满足了我对"负责任"效率的一般要求,同时又不牺牲易用性和简单性。

ElementTree有一个不错的pythony API。我认为它甚至是python 2.5的一部分

它是用纯python编写的,正如我所说的,还不错,但是如果我们最终需要更高的性能,则lxml公开相同的API并在后台使用libxml2. 从理论上讲,我们可以在发现需要时将其换入。

由于我们提到要构建"非常简单"的XML,因此minidom模块(Python标准库的一部分)可能会满足需求。如果我们对XML的DOM表示有任何经验,则应该找到非常简单的API。

我编写了一个SOAP服务器,该服务器接收XML请求并创建XML响应。 (不幸的是,这不是我的项目,所以它是封闭源代码,但这是另一个问题)。

对我来说,如果我们具有"适合"模式的数据结构,则创建(SOAP)XML文档非常简单。

我保留信封,因为响应信封(几乎)与请求信封相同。然后,由于我的数据结构是一个(可能是嵌套的)字典,所以我创建了一个字符串,将这个字典变成<key> value </ key>项。

这是使递归变得简单的任务,而我最终得到了正确的结构。这一切都在python代码中完成,并且目前足够快用于生产。

我们也可以(相对)轻松地构建列表,尽管我们可能会遇到问题,除非我们给出长度提示,这取决于客户。

对我来说,这要简​​单得多,因为字典比某些自定义类要容易得多。对于书籍而言,生成XML比解析容易得多!

我最近开始成功使用Amara。

通常,有3种主要的XML处理方式:dom,sax和xpath。如果我们有能力将整个xml文件立即加载到内存中,并且我们不介意处理数据结构,而我们正在研究的是大部分模型,那么dom模型将是一个很好的选择。如果我们只关心几个标签,并且/或者我们正在处理大文件并且可以按顺序处理它们,那么sax模型非常有用。 xpath模型只是每个模型的一点点-我们可以选择所需的数据元素的路径,但是它需要使用更多的库。

如果我们想直接使用Python打包,那么minidom是答案,但是这很la脚,文档是" dom的文档,请弄清楚"。真烦人。

就个人而言,我喜欢cElementTree,这是ElementTree的更快(基于c的)实现,而ElementTree是一个类似于dom的模型。

我使用过sax系统,并且在许多方面它们在感觉上更像" pythonic",但我通常最终会创建基于状态的系统来处理它们,而这就是疯狂(和错误)。

我说如果我们喜欢研究,可以选择minidom,如果我们想要好的代码可以很好地工作,则可以使用ElementTree。

我假设处理XML的.Net方式建立在MSXML的Som版本的基础上,在这种情况下,我假设使用minimini将使我们有种宾至如归的感觉。但是,如果处理简单,则我们正在执行的任何库都可能会执行。

我也更喜欢在Python中处理xml时使用ElementTree,这是一个非常简洁的库。

我已经将ElementTree用于多个项目并推荐它。

它是pythonic,随Python 2.5一起提供,包括c版本cElementTree(xml.etree.cElementTree),它比纯Python版本快20倍,并且非常易于使用。

lxml具有一些性能优势,但是它们并不平衡,因此我们应该首先检查一下用例的基准测试。

据我了解,ElementTree代码可以轻松移植到lxml。

如果我们要构建SOAP消息,请查看soaplib。它在后台使用ElementTree,但是它为序列化和反序列化消息提供了更加简洁的界面。

这取决于文件的复杂程度。

我在编写XML时经常使用minidom,但是通常只是读取文档,进行一些简单的转换,然后再写回。在我需要排序元素属性的能力之前,这已经足够好了(以满足无法正确解析XML的古老应用程序)。那时我放弃了,自己写了XML。

如果我们只处理简单的文档,那么比学习框架更快,更简单。如果可以想象手动编写XML,那么也可以手动编写XML(只是要记住正确地转义特殊字符,并使用str.encode(codec,errors =" xmlcharrefreplace"))。除了这些困难之外,XML足够普通,以至于我们不需要特殊的库来编写它。如果文档太复杂而无法手工编写,那么我们可能应该研究一下已经提到的框架之一。我们绝对不需要编写通用的XML编写器。