Создание простого XML-файла с помощью python



Каковы мои варианты, если я хочу создать простой XML-файл в python? (библиотека мудрый)



xml, который я хочу, выглядит так:



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

</root>
2048   5  

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 много)

для дальнейшего чтения, вот некоторые полезные ссылки:

в качестве заключительной ноты, либо 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 &lt;value&gt; for the &lt;bar&gt; document</field2>
 </doc>
</root>

недостатком подхода к шаблону является то, что вы не получите побег < и > бесплатно. Я танцевал вокруг этой проблемы, потянув в util от xml.sax

Comments

    Ничего не найдено.