5 ответов:
в наши дни наиболее популярным (и очень простым) вариантом является ElementTree API, который был включен в стандартную библиотеку с Python 2.5.
доступные параметры для этого:
- ElementTree (базовая, чисто-Python реализация ElementTree. Часть стандартной библиотеки начиная с 2.5)
- cElementTree (оптимизированная реализация C ElementTree. Также предлагается в стандартной библиотеке начиная с 2.5)
- LXML (Основан на библиотеке libxml2. Предлагает богатый суперсет API ElementTree, а также 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 много)
для дальнейшего чтения, вот некоторые полезные ссылки:
- API docs для реализации в стандартной библиотеке Python
- Вводный Учебник (С сайта автора)
- lxml etree tutorial. (С примером кода для загрузки наилучшего доступного варианта из всех основных реализаций ElementTree)
в качестве заключительной ноты, либо cElementTree или LXML должно быть достаточно быстро для всех ваших потребностей (оба оптимизированы c-кодом), но в случае, если вы находитесь в ситуации, когда вам нужно выжать каждый последний бит производительности, тесты на сайте LXML указывают на то, что:
- LXML явно выигрывает для сериализации (генерации) XML
- как побочный эффект реализации правильного родительского обхода, LXML немного медленнее, чем cElementTree для синтаксического анализа.
The библиотека библиотека 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'))
Yattag http://www.yattag.org/ или https://github.com/leforestier/yattag предоставляет интересный API для создания таких 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>
для самого простого выбора, я бы пошел с minidom:http://docs.python.org/library/xml.dom.minidom.html . Он встроен в стандартную библиотеку python и прост в использовании в простых случаях.
вот довольно легко следовать учебник:http://www.boddie.org.uk/python/XML_intro.html
для такой простой структуры XML, вы не можете включить полномасштабный модуль XML. Рассмотрим шаблон строки для самых простых структур или Jinja для чего-то немного более сложного. Jinja может обрабатывать цикл по списку данных для создания внутреннего xml вашего списка документов. Это немного сложнее с необработанными шаблонами строк python
для примера Джинджа, см. Мой ответ на аналогичный вопрос.
вот пример создания вашего 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 <value> for the <bar> document</field2> </doc> </root>недостатком подхода к шаблону является то, что вы не получите побег
<и>бесплатно. Я танцевал вокруг этой проблемы, потянув в util отxml.sax
Comments