После чтения из существующего файла с "уродливым" XML и внесения некоторых изменений, довольно печатная работа не работает. Я пробовал etree.write(FILE_NAME, pretty_print=True)
.
У меня есть следующий XML:
<testsuites tests="14" failures="0" disabled="0" errors="0" time="0.306" name="AllTests">
<testsuite name="AIR" tests="14" failures="0" disabled="0" errors="0" time="0.306">
....
И я использую его следующим образом:
tree = etree.parse('original.xml')
root = tree.getroot()
...
# modifications
...
with open(FILE_NAME, "w") as f:
tree.write(f, pretty_print=True)
Ответ 1
Для меня эта проблема не была решена, пока я не заметил этот маленький лакомый кусочек здесь:
http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output
Краткая версия:
Прочитайте в файле с помощью этой команды:
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> tree = etree.parse(filename, parser)
Это будет "reset" уже существующий отступ, позволяющий вывести его собственный собственный отступ. Тогда pretty_print как обычно:
>>> tree.write(<output_file_name>, pretty_print=True)
Ответ 2
Хорошо, согласно API docs, в модуле lxml etree не существует метода "write". У вас есть несколько вариантов, связанных с тем, чтобы получить довольно напечатанную строку xml в файл. Вы можете использовать метод tostring следующим образом:
f = open('doc.xml', 'w')
f.write(etree.tostring(root, pretty_print=True))
f.close()
Или, если ваш источник входного сигнала менее совершенен и/или вы хотите больше кнопок и кнопок, чтобы настроить свой выход, вы можете использовать одну из оболочек python для аккуратной библиотеки.
http://utidylib.berlios.de/
import tidy
f.write(tidy.parseString(your_xml_str, **{'output_xml':1, 'indent':1, 'input_xml':1}))
http://countergram.com/open-source/pytidylib
from tidylib import tidy_document
document, errors = tidy_document(your_xml_str, options={'output_xml':1, 'indent':1, 'input_xml':1})
f.write(document)
Ответ 3
fp = file('out.txt', 'w')
print(e.tree.tostring(...), file=fp)
fp.close()
Ответ 4
Я не знаю, почему другие ответы не упомянули об этом. Если вы хотите получить корень xml
, существует метод под названием getroot()
. Надеюсь, я ответил на ваш вопрос (хотя и немного поздно).
tree = et.parse(xmlFile)
root = tree.getroot()
Ответ 5
Вот ответ, исправленный для работы с Python 3:
from lxml import etree
from sys import stdout
from io import BytesIO
parser = etree.XMLParser(remove_blank_text = True)
file_obj = BytesIO(text)
tree = etree.parse(file_obj, parser)
tree.write(stdout.buffer, pretty_print = True)
где text
- код xml в виде последовательности байтов.