使用Python创建简单的XML文件

223 投票
6 回答
466417 浏览
提问于 2025-04-16 03:30

如果我想在Python中创建一个简单的XML文件,我有哪些选择?(从库的角度来说)

我想要的XML文件看起来是这样的:

<root>
 <doc>
     <field1 name="blah">some value1</field1>
     <field2 name="asdfasd">some vlaue2</field2>
 </doc>

</root>

6 个回答

30

Yattag http://www.yattag.org/ 或者 https://github.com/leforestier/yattag 提供了一个有趣的接口,可以用来创建 XML 文档(还有 HTML 文档)。

它使用了 上下文管理器with 这个关键词。

from yattag import Doc, indent

doc, tag, text = Doc().tagtext()

with tag('root'):
    with tag('doc'):
        with tag('field1', name='blah'):
            text('some value1')
        with tag('field2', name='asdfasd'):
            text('some value2')

result = indent(
    doc.getvalue(),
    indentation = ' '*4,
    newline = '\r\n'
)

print(result)

所以你会得到:

<root>
    <doc>
        <field1 name="blah">some value1</field1>
        <field2 name="asdfasd">some value2</field2>
    </doc>
</root>
78

lxml库提供了一种非常方便的语法来生成XML,这种语法被称为E-factory。下面是我如何制作你给出的例子的:

#!/usr/bin/python
import lxml.etree
import lxml.builder    

E = lxml.builder.ElementMaker()
ROOT = E.root
DOC = E.doc
FIELD1 = E.field1
FIELD2 = E.field2

the_doc = ROOT(
        DOC(
            FIELD1('some value1', name='blah'),
            FIELD2('some value2', name='asdfasd'),
            )   
        )   

print lxml.etree.tostring(the_doc, pretty_print=True)

输出结果:

<root>
  <doc>
    <field1 name="blah">some value1</field1>
    <field2 name="asdfasd">some value2</field2>
  </doc>
</root>

它还支持在已经创建的节点上添加内容,比如在上面的基础上,你可以这样做:

the_doc.append(FIELD2('another value again', name='hithere'))
409

现在,最流行(而且非常简单)的选择是 ElementTree API,这个工具从Python 2.5开始就已经包含在标准库里了。

关于这个工具,有以下几种选择:

  • ElementTree(基本的、纯Python实现的ElementTree。从2.5版本开始就是标准库的一部分)
  • cElementTree(优化过的C语言实现的ElementTree。从2.5版本开始也在标准库中。不过在3.3版本后被标记为过时,自动合并进了普通的ElementTree中)
  • LXML(基于libxml2,提供了ElementTree API的丰富扩展,还支持XPath、CSS选择器等更多功能)

下面是一个使用标准库中的cElementTree生成示例文档的例子:

import xml.etree.cElementTree as ET

root = ET.Element("root")
doc = ET.SubElement(root, "doc")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

tree = ET.ElementTree(root)
tree.write("filename.xml")

我测试过这个代码,它是可以工作的,但我假设空格不重要。如果你需要“漂亮打印”的缩进,告诉我,我会查一下怎么做。(这可能是LXML特有的选项。我不太使用标准库的实现)

如果你想进一步了解,这里有一些有用的链接:

最后要说的是,cElementTree或LXML都足够快,可以满足你的所有需求(它们都是优化过的C代码),但如果你在一个需要极限性能的情况下,LXML网站上的基准测试显示:

  • LXML在生成XML方面明显更快
  • 由于实现了正确的父节点遍历,LXML在解析时比cElementTree稍慢一些。

撰写回答