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

时间:2010-08-31 02:38:24

标签: python xml

如果我想在python中创建一个简单的XML文件,我有什么选择? (图书馆明智)

我想要的xml看起来像:

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

</root>

6 个答案:

答案 0 :(得分:256)

现在,最流行(也很简单)的选项是ElementTree API, 自Python 2.5以来已包含在标准库中。

可用选项包括:

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

以下是使用in-stdlib 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")

我测试了它并且它有效,但我假设空白并不重要。如果你需要“prettyprint”缩进,请告诉我,我会查看如何做到这一点。 (它可能是特定于LXML的选项。我不使用stdlib实现很多)

如需进一步阅读,请参阅以下链接:

作为最后一点,cElementTree或LXML应该足够快以满足您的所有需求(两者都是优化的C代码),但是如果您需要挤出最后一点性能, LXML网站上的基准表明:

  • LXML明显胜出序列化(生成)XML
  • 作为实现正确父遍历的副作用,LXML比cElementTree慢一点,用于解析。

答案 1 :(得分:56)

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

答案 2 :(得分:6)

对于最简单的选择,我会选择minidom:http://docs.python.org/library/xml.dom.minidom.html。它内置于python标准库中,在简单的情况下可以直接使用。

这是一个非常容易理解的教程:http://www.boddie.org.uk/python/XML_intro.html

答案 3 :(得分:3)

对于这样一个简单的XML结构,您可能不希望涉及完整的XML模块。考虑最简单结构的字符串模板,或者考虑更复杂的Jinja。 Jinja可以处理循环数据列表以生成文档列表的内部xml。对于原始的python字符串模板来说,这有点棘手

有关Jinja示例,请参阅我的answer to a similar question

以下是使用字符串模板生成xml的示例。

import string
from xml.sax.saxutils import escape

inner_template = string.Template('    <field${id} name="${name}">${value}</field${id}>')

outer_template = string.Template("""<root>
 <doc>
${document_list}
 </doc>
</root>
 """)

data = [
    (1, 'foo', 'The value for the foo document'),
    (2, 'bar', 'The <value> for the <bar> document'),
]

inner_contents = [inner_template.substitute(id=id, name=name, value=escape(value)) for (id, name, value) in data]
result = outer_template.substitute(document_list='\n'.join(inner_contents))
print result

输出:

<root>
 <doc>
    <field1 name="foo">The value for the foo document</field1>
    <field2 name="bar">The &lt;value&gt; for the &lt;bar&gt; document</field2>
 </doc>
</root>

模板方法的缺点是你不会免费逃脱<>。我通过从xml.sax

中提取一个工具来绕过这个问题

答案 4 :(得分:0)

我刚刚使用bigh_29的Templates方法编写了一个xml生成器...这是一种控制输出内容的好方法,而没有太多对象“阻碍”。

对于标签和值,我使用了两个数组,一个数组在输出xml中给出了标签的名称和位置,另一个数组引用了具有相同标签列表的参数文件。但是,参数文件在相应的输入(csv)文件中也具有位置编号,将从中获取数据。 这样,如果来自输入文件的数据位置发生任何变化,则程序不会改变;它可以从参数文件中的相应标签动态计算出数据字段的位置。

答案 5 :(得分:-1)

标记和值需要被优先使用,并且要使其正常工作。在找到要显示的代码作为示例之前,我已经完成了此操作。

同时在此处查找更多信息- https://www.w3schools.com/php/