Python довольно печатает XML с учетом строки XML

Я сгенерировал длинную и уродливую строку XML с помощью Python, и мне нужно отфильтровать ее через красивый принтер, чтобы она выглядела лучше.

Я нашел этот пост для красивых принтеров python, но мне нужно записать строку XML в файл, который нужно прочитать, чтобы использовать инструменты, которых я хочу избежать, если это возможно.

Какие существуют красивые инструменты Python, которые работают со строками?


person prosseek    schedule 20.10.2010    source источник
comment
Какую XML-библиотеку Python вы используете?   -  person Paul McMillan    schedule 20.10.2010
comment
@Paul: я использую импорт minidom из xml.dom.   -  person prosseek    schedule 20.10.2010


Ответы (3)


Вот как можно преобразовать текстовую строку в структурированный тип данных lxml.

Питон 2:

from lxml import etree
xml_str = "<parent><child>text</child><child>other text</child></parent>"
root = etree.fromstring(xml_str)
print etree.tostring(root, pretty_print=True)

Питон 3:

from lxml import etree
xml_str = "<parent><child>text</child><child>other text</child></parent>"
root = etree.fromstring(xml_str)
print(etree.tostring(root, pretty_print=True).decode())

Выходы:

<parent>
  <child>text</child>
  <child>other text</child>
</parent>
person monkut    schedule 20.10.2010
comment
у меня были некоторые проблемы с побегом, и метод etree.tounicode разрешил их - person mut1na; 11.10.2017
comment
В Python 3 используйте print(etree.tostring(tree, pretty_print=True).decode()). - person orodbhen; 15.02.2018

Я пользуюсь библиотекой lxml, а там все просто

>>> print(etree.tostring(root, pretty_print=True))

Вы можете выполнить эту операцию, используя любой etree, который вы можете сгенерировать программно или прочитать из файла.

Если вы используете DOM из PyXML, это

import xml.dom.ext
xml.dom.ext.PrettyPrint(doc)

Это печатает на стандартный вывод, если вы не укажете альтернативный поток.

http://pyxml.sourceforge.net/topics/howto/node19.html

Чтобы напрямую использовать минидом, вы хотите использовать функцию toprettyxml().

http://docs.python.org/library/xml.dom.minidom.html#xml.dom.minidom.Node.toprettyxml

person Paul McMillan    schedule 20.10.2010
comment
Похоже, что и root, и doc являются структурированными данными, а не строкой. Спасибо за ответ. - person prosseek; 20.10.2010
comment
Если ваш xml существует как узел minidom, вы можете использовать функцию toprettyxml(). Если он действительно существует только в виде строки, вам придется разобрать его, прежде чем вы сможете распечатать его. - person Paul McMillan; 20.10.2010

Вот решение Python3, которое избавляется от уродливой проблемы новой строки (тонны пробелов) и использует только стандартные библиотеки, в отличие от большинства других реализаций. Вы упомянули, что у вас уже есть строка xml, поэтому я предполагаю, что вы использовали xml.dom.minidom.parseString()

С помощью следующего решения вы можете сначала избежать записи в файл:

import xml.dom.minidom
import os

def pretty_print_xml_given_string(input_string, output_xml):
    """
    Useful for when you are editing xml data on the fly
    """
    xml_string = input_string.toprettyxml()
    xml_string = os.linesep.join([s for s in xml_string.splitlines() if s.strip()]) # remove the weird newline issue
    with open(output_xml, "w") as file_out:
        file_out.write(xml_string)

Я нашел, как исправить распространенную проблему с новой строкой здесь.

person Josh Correia    schedule 12.02.2020