Python中的XML处理

我即将构build一个需要构buildXML文档并将其发布到Web服务的项目,我想用Python来实现,以扩展我的技能。

不幸的是,尽pipe在.NET中我很了解XML模型,但是我不确定Python中XML模型的优点和缺点。

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

就个人而言,我已经在一个XML重大的项目中使用了一些内置的选项,并且已经把pulldom作为不太复杂的文档的最佳select。

特别是对于一些小的简单的东西,我喜欢事件驱动的parsing理论,而不是为相对简单的结构设置一大堆callback。 以下是如何使用API​​的快速讨论 。

我喜欢:你可以在for循环中处理parsing,而不是使用callback。 您还可以延迟完整parsing(“拉”部分),只有在调用expandNode()时才能获得更多详细信息。 这满足了我对“负责任”效率的一般要求,同时又不牺牲易用性和简单性。

ElementTree有一个很好的pythony API。 我想它甚至是Python 2.5的一部分

它是在纯Python中,正如我所说,相当不错,但如果你需要更多的性能,那么lxml暴露相同的API,并使用libxml2。 你理论上可以在你发现需要的时候交换它。

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

处理XML有三种主要的方式,一般是:dom,sax和xpath。 如果你可以负担你的整个xml文件到内存中一次,你不介意处理数据结构,并且你正在查看很多/大部分的模型。 如果您只关心一些标签,或者您正在处理大文件,并且可以按顺序处理这些文件,那么萨克斯模型非常棒。 xpath模型各有一点 – 您可以select所需数据元素的path,但需要使用更多的库。

如果你想直接用Python打包,minidom就是你的答案,但是相当蹩脚,文档是“这里是关于dom的文档,去搞清楚”。 真的很烦人

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

我已经使用了sax系统,在很多方面他们的感觉更“pythonic”,但我通常最终创build基于状态的系统来处理它们,这就是疯狂(和错误)。

如果你喜欢研究,或者ElementTree,如果你想要很好的代码,

我已经使用ElementTree几个项目,并推荐它。

Python python是Python 2.5的一个包装盒,包含c版本cElementTree(xml.etree.cElementTree),比纯Python版本快20倍,使用起来非常简单。

lxml有一些性能上的优势,但是它们不均衡,你应该首先检查你的用例的基准。

据我所知,ElementTree代码可以很容易地移植到lxml。

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

对我来说,如果你有一个“适合”模式的数据结构,那么创build(SOAP)XML文档就相当简单了。

我保留了信封,因为回复信封与请求信封几乎相同。 然后,因为我的数据结构是一个(可能是嵌套的)字典,所以我创build了一个string,将这个字典转换为<key>值</ key>项。

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

您也可以(相对)轻松地build立列表,虽然取决于您的客户,除非您提供长度提示,否则您可能遇到问题。

对我来说,这是非常简单的,因为字典比一些自定义类更容易工作。 对于书籍来说,生成XML比parsing要容易得多!

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

我已经使用minidom编写XML,但通常只是读取文档,进行一些简单的转换,并将其写回。 直到我需要订购元素属性(以满足不能正确parsingXML的古老应用程序)的能力时,这种方法运行良好。 那时我放弃了,自己写了XML。

如果你只是在简单的文档上工作,那么自己做就可以比学习框架更快,更简单。 如果你可以手工编写XML,那么你也可以手工编写它(只要记住要正确地转义特殊字符,并使用str.encode(codec, errors="xmlcharrefreplace") )。 除了这些snafus之外,XML是足够正规的,您不需要特殊的库来编写它。 如果文档太复杂,无法手工编写,那么您应该查看已经提到的框架之一。 你不需要写一个通用的XML编写器。

您也可以尝试解开简单的XML文档。

既然您提到您将构build“相当简单”的XML,那么minidom模块 (Python标准库的一部分)将可能适合您的需求。 如果您对XML的DOM表示有任何经验,那么您应该发现API非常简单。

我个人认为从Dive into Python这一章很棒。 首先检查一下 – 它使用minidom模块,是一个相当不错的写作。

对于在Python中使用XML的严肃工作,使用lxml

Python自带ElementTree库,但是lxml在速度和function(模式validation,saxparsing,XPath,各种迭代器和许多其他function)方面进行了扩展。

你必须安装它,但是在许多地方它已经被认为是标准设备的一部分(例如,Google AppEngine不允许基于C的Python包,但是除了lxml,pyyaml和其他几个)。

用E-factory构buildXML文档(来自lxml)

你的问题是关于build立XML文件。

使用lxml有很多方法,我花了一段时间find一个,这似乎是易于使用,也易于阅读。

使用E-factory的lxml doc示例代码(稍微简化):


E-factory为生成XML和HTML提供了一个简单而紧凑的语法:

 >>> from lxml.builder import E >>> html = page = ( ... E.html( # create an Element called "html" ... E.head( ... E.title("This is a sample document") ... ), ... E.body( ... E.h1("Hello!"), ... Ep("This is a paragraph with ", Eb("bold"), " text in it!"), ... Ep("This is another paragraph, with a", "\n ", ... Ea("link", href="http://www.python.org"), "."), ... Ep("Here are some reserved characters: <spam&egg>."), ... ) ... ) ... ) >>> print(etree.tostring(page, pretty_print=True)) <html> <head> <title>This is a sample document</title> </head> <body> <h1>Hello!</h1> <p>This is a paragraph with <b>bold</b> text in it!</p> <p>This is another paragraph, with a <a href="http://www.python.org">link</a>.</p> <p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p> </body> </html> 

我欣赏电子工厂以下的东西

代码几乎与生成的XML文档一样

可读性计数。

允许创build任何XML内容

支持像这样的东西:

  • 使用名称空间
  • 在一个元素内开始和结束文本节点
  • 函数格式化属性内容(详见func CLASS in full lxml sample )

允许具有清单的非常可读的结构

例如:

 from lxml import etree from lxml.builder import E lst = ["alfa", "beta", "gama"] xml = E.root(*[E.record(itm) for itm in lst]) etree.tostring(xml, pretty_print=True) 

导致:

 <root> <record>alfa</record> <record>beta</record> <record>gama</record> </root> 

结论

我强烈build议阅读lxml教程 – 这是写得很好,会给你更多的理由使用这个强大的库。

lxml唯一的缺点就是它必须被编译。 请参阅SO回答以获取更多提示,如何在几分之一秒内从wheel格式的包中安装lxml。

我最近开始使用阿马拉成功。

我认为处理XML的.Net方式是build立在MSXML的版本上的,我假设使用例如minidom会让你感觉有点在家。 但是,如果这是简单的处理,你正在做任何图书馆可能会做。

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

如果您打算构buildSOAP消息,请查看soaplib 。 它在底层使用ElementTree,但它为序列化和反序列化消息提供了一个非常干净的接口。

我强烈推荐SAX – 用于XML的简单API – 在Python库中实现。 如以前的海报所讨论的那样,它们甚至可以通过驱动的API来设置和处理大型的XML,而且与validationDOM风格的XMLparsing器不同,其内存占用less。

我认为你应该使用lxml来实现这个function