Довольно печатать в lxml не удается, когда я добавляю теги в обработанное дерево
У меня есть xml файл, из которого я использую etree из lxml для работы, но когда я добавляю к нему теги, довольно печатная работа не работает.
>>> from lxml import etree
>>> root = etree.parse('file.xml').getroot()
>>> print etree.tostring(root, pretty_print = True)
<root>
<x>
<y>test1</y>
</x>
</root>
Пока все хорошо. Но теперь
>>> x = root.find('x')
>>> z = etree.SubElement(x, 'z')
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1'
>>> print etree.tostring(root, pretty_print = True)
<root>
<x>
<y>test1</y>
<z><z1 value="val1"/></z></x>
</root>
это уже не симпатично. Я также попытался сделать это "назад", где создаю тэг z1, затем создаю тэг z и добавлю z1 к нему, а затем добавлю тэг z к тегу x. Но я получаю тот же результат.
Если я не разбираю файл и просто создаю все теги за один раз, он будет печатать правильно. Поэтому я думаю, что это имеет какое-то отношение к разбору файла.
Как я могу получить печатную работу?
Ответы
Ответ 1
Это связано с тем, как lxml
обрабатывает пробелы - подробнее см. lxml FAQ.
Чтобы исправить это, измените загрузочную часть файла на следующее:
parser = etree.XMLParser(remove_blank_text=True)
root = etree.parse('file.xml', parser).getroot()
Я не тестировал его, но он должен отменить ваш файл с этим изменением.
Ответ 2
У меня возникла та же проблема при записи в файлы, для всех остальных с этой проблемой:
Я создал вспомогательную функцию, которая pretty_prints после запуска моей основной функции.
from lxml import etree
def ppxml(xml):
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(xml, parser)
tree.write(xml, encoding='utf-8', pretty_print=True, xml_declaration=True)
В моем основном файле программы
if __name__ == '__main__':
main()
ppxml(xml)