При печати тегов в lxml происходит сбой - PullRequest
26 голосов
/ 26 октября 2011

У меня есть 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. Но я получаю тот же результат.

Если я не проанализирую файл и просто создаю все теги за один раз, он будет печататься правильно. Поэтому я думаю, что это как-то связано с разбором файла.

Как заставить работать красивую печать?

Ответы [ 2 ]

38 голосов
/ 26 октября 2011

Это связано с тем, как lxml обрабатывает пробелы - подробности см. В lxml FAQ .

Чтобы исправить это, измените загрузочную часть файла следующим образом:

parser = etree.XMLParser(remove_blank_text=True)
root = etree.parse('file.xml', parser).getroot()

Я не тестировал его, но он должен хорошо сдвинуть ваш файл с этим изменением.

0 голосов
/ 01 октября 2018

У меня возникла та же проблема при записи в файлы, для всех остальных с этой проблемой:

Я создал вспомогательную функцию, которая 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)
...