2015-06-22 2 views
0

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

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 Q & элементов а Pretty printing XML in Python, но они, кажется, в основном требуют другого внешнего LIBS? и задавался вопросом, есть ли способ не использовать их?

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

+0

'minidom' находится в стандартной библиотеке. Вы можете использовать 'minidom' для создания документа, а затем вызвать его метод' toprettyxml'. – unutbu

+0

Я не вижу, как этот скрипт «делает xml-файл и сохраняет» его. Где код, который сохраняет файл? –

+0

@ Robᵩ жаль, что я забыл сэкономить –

ответ

0

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

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)) 
Смежные вопросы