Украсить xml в Python eTree

У меня есть этот простой скрипт py, который создает XML-файл и сохраняет его, и мне было интересно, есть ли простой способ сделать отступ?

import xml.etree.cElementTree as ET


root = ET.Element("root")
doc = ET.SubElement(root, "doc", location="one")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

Я просмотрел некоторые другие вопросы и ответы SO, Pretty print XML in Python, но они, похоже, в основном требуют другие внешние библиотеки? и было интересно, есть ли способ не использовать их?

Спасибо за помощь.


person james brown    schedule 22.06.2015    source источник
comment
minidom находится в стандартной библиотеке. Вы можете использовать minidom для создания документа, а затем вызвать его метод toprettyxml.   -  person unutbu    schedule 22.06.2015
comment
Я не понимаю, как этот скрипт создает XML-файл и сохраняет его. Где код, который сохраняет файл?   -  person Robᵩ    schedule 22.06.2015
comment
@Robᵩ извините, я забыл включить сохранение   -  person james brown    schedule 22.06.2015
comment
@unutbu не могли бы вы показать мне, как это сделать, пожалуйста?   -  person james brown    schedule 22.06.2015


Ответы (1)


Вы можете использовать модуль minidom стандартной библиотеки toprettyxml метод:

import xml.dom.minidom as minidom

xml = minidom.Document()
root = xml.createElement("root")
xml.appendChild(root)

doc = xml.createElement("doc")
doc.setAttribute("location", "one")
root.appendChild(doc)

field = xml.createElement("field1")
field.setAttribute("name", "blah")
text = xml.createTextNode("some value1")
field.appendChild(text)
doc.appendChild(field)

field = xml.createElement("field2")
field.setAttribute("name", "asdfasd")
text = xml.createTextNode("some value2")
field.appendChild(text)

doc.appendChild(field)
print(xml.toprettyxml(indent=' '*4))

урожаи

<?xml version="1.0" ?>
<root>
    <doc location="one">
        <field1 name="blah">some value1</field1>
        <field2 name="asdfasd">some value2</field2>
    </doc>
</root>

Или, если вы предпочитаете методы ElementTree для создания XML и не возражаете против некоторой неэффективности, вы можете использовать ElementTree для записи неформатированного XML в StringIO (для Python2) или ByteIO (для Python3), разберите его в документ minidom, а затем снова запишите его, используя toprettyxml:

import xml.etree.cElementTree as ET
import xml.dom.minidom as minidom

try:
    # for Python2
    from cStringIO import StringIO as BytesIO
except ImportError:
    # for Python3
    from io import BytesIO

root = ET.Element("root")
doc = ET.SubElement(root, "doc", location="one")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"
buf = BytesIO()
buf.write(ET.tostring(root))
buf.seek(0)
root = minidom.parse(buf)
print(root.toprettyxml(indent=' '*4))
person unutbu    schedule 22.06.2015