Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的XML处理_Python_Xml - Fatal编程技术网

Python中的XML处理

Python中的XML处理,python,xml,Python,Xml,我将要构建一个项目的一部分,该项目将需要构造一个XML文档并将其发布到web服务,我想用Python来实现这一点,以此来扩展我的it技能 不幸的是,虽然我对.NET中的XML模型相当了解,但我不确定Python中的XML模型的优缺点 有没有人有用Python处理XML的经验?你建议我从哪里开始?我将要构建的XML文件将相当简单。就我个人而言,我已经在一个大量使用XML的项目中使用了几种内置选项,并已确定为不太复杂的文档的最佳选择 特别是对于一些简单的小东西,我喜欢事件驱动的解析理论,而不是为一个

我将要构建一个项目的一部分,该项目将需要构造一个XML文档并将其发布到web服务,我想用Python来实现这一点,以此来扩展我的it技能

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


有没有人有用Python处理XML的经验?你建议我从哪里开始?我将要构建的XML文件将相当简单。

就我个人而言,我已经在一个大量使用XML的项目中使用了几种内置选项,并已确定为不太复杂的文档的最佳选择

特别是对于一些简单的小东西,我喜欢事件驱动的解析理论,而不是为一个相对简单的结构设置一系列回调

我喜欢的是:您可以在
for
循环中处理解析,而不是使用回调。您还可以延迟完全解析(“拉”部分),并且仅在调用
expandNode()
时才能获得额外的详细信息。这在不牺牲易用性和简单性的情况下满足了我对“负责任的”效率的一般要求。

有一个很好的Python API。我认为它甚至是作为Python2.5的一部分发布的


它是纯python的,正如我所说,非常好,但是如果您最终需要更高的性能,那么就公开相同的API并在幕后使用libxml2。从理论上讲,当您发现需要时,您可以将其替换进来。

因为您提到要构建“相当简单”的XML,所以(Python标准库的一部分)可能会满足您的需要。如果您对XML的DOM表示有任何经验,您应该会发现API非常简单。

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

事实证明,如果您有一个“适合”模式的数据结构,那么创建(SOAP)XML文档就相当简单

我保留信封,因为响应信封(几乎)与请求信封相同。然后,因为我的数据结构是一个(可能是嵌套的)字典,所以我创建了一个字符串,将这个字典转换为值项

这是一个递归简化的任务,我最终得到了正确的结构。这一切都是在python代码中完成的,目前对于生产使用来说已经足够快了

您还可以(相对)轻松地构建列表,尽管根据客户的不同,除非给出长度提示,否则可能会遇到问题


对我来说,这要简单得多,因为字典比一些自定义类更容易使用。对于书籍来说,生成XML比解析要容易得多

通常有三种处理XML的主要方法:dom、sax和xpath。如果您能够负担得起将整个xml文件一次加载到内存中的费用,并且您不介意处理数据结构,并且您正在查看模型的大部分内容,那么dom模型是很好的。如果您只关心几个标记,并且/或者您正在处理大文件,并且可以按顺序处理它们,那么sax模型是非常好的。xpath模型各有一点不同——您可以选择所需数据元素的路径,但它需要使用更多的库

如果您希望使用Python进行简单的打包,minidom是您的答案,但它非常蹩脚,文档是“这是关于dom的文档,去弄清楚它”。真烦人

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

我使用过sax系统,在很多方面,它们的感觉更“pythonic”,但我通常会创建基于状态的系统来处理它们,这种方式存在疯狂(和bug)


如果你喜欢研究,我建议你使用minidom;如果你想要好的代码,我建议你使用ElementTree。

我假设.NET处理XML的方式是建立在MSXML的某个版本上的,在这种情况下,我假设使用minidom(例如)会让你有一种宾至如归的感觉。然而,如果您正在做的是简单的处理,那么任何库都可能会这样做


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

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

它是pythonic的,与Python2.5一起“在盒子里”,包括c版本cElementTree(xml.etree.cElementTree),它比纯Python版本快20倍,并且非常易于使用

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


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

如果您要构建SOAP消息,请查看。它在后台使用ElementTree,但它为序列化和反序列化消息提供了一个更干净的界面。

这取决于文档需要有多复杂

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

如果您只处理简单的文档,那么自己动手做会比学习框架更快、更简单。如果您可以手工编写XML,那么您也可以手工编写它(只需记住正确地转义特殊字符,并使用
str.encode(codec,errors=“xmlcharrefreplace”)
)。除了这些混乱之外,XML非常规则,您不需要特殊的库来编写它。如果文档太复杂,无法手工编写,那么您可能应该研究前面提到的框架之一。在任何时候都不需要编写通用的XML wri
>>> 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!"),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("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>
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>