使用python创建一个简单的XML文件

2024-04-18 18:20:31 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我想用python创建一个简单的XML文件,我有什么选择?(图书馆方面)

我想要的xml看起来像:

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

</root>

Tags: 文件namedoc图书馆somerootxmlblah
3条回答

Yattaghttp://www.yattag.org/https://github.com/leforestier/yattag提供了一个有趣的API来创建这样的XML文档(以及HTML文档)。

它使用了context managerwith关键字。

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>

lxml library包含一种非常方便的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'))

现在,最流行的(也是最简单的)选项是ElementTree API, 从Python2.5开始就包含在标准库中。

可用的选项有:

  • ElementTree(ElementTree的基本纯Python实现。从2.5开始成为标准库的一部分)
  • cElementTree(ElementTree的优化C实现。从2.5开始也在标准库中提供)
  • LXML(基于libxml2。提供了丰富的ElementTree API超集以及XPath、CSS选择器等)

下面是如何使用in stdlib celementree生成示例文档的示例:

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")

我已经测试过了,而且有效,但我假设空白并不重要。如果你需要“prettyprint”缩进,让我知道,我会查怎么做。(它可能是LXML特定的选项。我很少使用stdlib实现)

为了进一步阅读,这里有一些有用的链接:

最后,cElementTree或LXML应该足够快,可以满足您的所有需求(都是经过优化的C代码),但是如果您在需要挤出最后一点性能的情况下,LXML站点上的基准表明:

  • LXML显然在序列化(生成)XML方面胜出
  • 作为实现正确父遍历的副作用,LXML的解析速度比celementree慢一些。

相关问题 更多 >