В наши дни наиболее популярным (и очень простым) вариантом является API ElementTree , который был включен в стандартную библиотеку начиная с Python 2.5.
Доступные варианты для этого:
- ElementTree (Базовая реализация ElementTree на чистом Python. Часть стандартной библиотеки начиная с 2.5)
- cElementTree (Оптимизированная реализация ElementTree на C. Также предлагается в стандартной библиотеке с 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)
Для дальнейшего чтения вот несколько полезных ссылок:
В заключение отметим, что cElementTree или LXML должны быть достаточно быстрыми для всех ваших потребностей (оба оптимизированных кода C), но в случае, если вам нужно выжать все до последней черты производительности, тесты производительности сайт LXML указывает, что:
- LXML явно выигрывает за сериализацию (генерацию) XML
- Как побочный эффект от реализации правильного родительского обхода, LXML немного медленнее, чем cElementTree для анализа.
xml_declaration=True
если вы задаете кодировку ... но, чтобы получить эквивалентное поведение, вызовитеtree.write()
так:tree.write("filename.xml", xml_declaration=True, encoding='utf-8')
Вы можете использовать любую кодировку, если вы явно укажете один. (ascii
принудительно закодирует все символы Unicode за пределами 7-битного набора ASCII, если вы не доверяете правильной настройке веб-сервера.)vlaue2
наvalue2
: опечатка в запрашиваемом выводе XML в исходном вопросе. До этого изменения, опечатка здесь на самом деле не является правильной.cElementTree
был объявленБиблиотека lxml включает в себя очень удобный синтаксис для генерации XML, называемый E-factory . Вот как я приведу пример, который вы приводите:
Вывод:
Он также поддерживает добавление к уже созданному узлу, например, после вышесказанного можно сказать
источник
getattr
, например,getattr(E, "some-tag")
.Yattag http://www.yattag.org/ или https://github.com/leforestier/yattag предоставляет интересный API для создания такого XML-документа (а также HTML-документов).
Он использует менеджер контекста и
with
ключевое слово.так вы получите:
источник
Для простейшего выбора я бы выбрал минидом: 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
Для примера Jinja, см. Мой ответ на аналогичный вопрос .
Вот пример создания вашего xml с помощью строковых шаблонов.
Вывод:
Недостатком шаблонного подхода является то, что вы не сможете избежать
<
и>
бесплатно. Я танцевал вокруг этой проблемы, вытаскивая утилиту изxml.sax
источник
Я только что закончил писать генератор xml, используя метод шаблонов bigh_29 ... это хороший способ контролировать то, что вы выводите без слишком большого количества объектов, попадающих «в пути».
Что касается тега и значения, я использовал два массива, один из которых давал имя и позицию тега в выходном xml, а другой - ссылку на файл параметров, содержащий тот же список тегов. Файл параметров, однако, также имеет номер позиции в соответствующем файле ввода (CSV), откуда данные будут взяты. Таким образом, если есть какие-либо изменения в положении данных, поступающих из входного файла, программа не изменится; он динамически определяет положение поля данных из соответствующего тега в файле параметров.
источник