Каков наилучший (или различные) способ печатать XML в Python?
python
xml
pretty-print
Hortitude
источник
источник
lxml недавно обновлен и включает в себя красивую функцию печати
Ознакомьтесь с руководством по lxml: http://lxml.de/tutorial.html
источник
aptitude install
далеко. Под OS / X я не уверен.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. Запись в выходной файл возможна всего за одну строку, промежуточная переменная не требуется:etree.parse("filename").write("outputfile", encoding="utf-8")
Другое решение - заимствовать эту
indent
функцию для использования с библиотекой ElementTree, которая встроена в Python начиная с 2.5. Вот как это будет выглядеть:источник
tree.write([filename])
для записи в файл (tree
будучи экземпляром ElementTree).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Вот мое (хакерское?) Решение, чтобы обойти уродливую проблему текстового узла.
Приведенный выше код будет производить:
Вместо этого:
Отказ от ответственности: вероятно, есть некоторые ограничения.
источник
re.compile
доsub
операции (я использовалre.findall()
дважды,zip
иfor
цикл сstr.replace()
...)Как отмечали другие, в lxml встроен симпатичный принтер.
Имейте в виду, что по умолчанию он изменяет разделы CDATA на обычный текст, что может привести к неприятным результатам.
Вот функция Python, которая сохраняет входной файл и изменяет только отступ (обратите внимание на
strip_cdata=False
). Кроме того, он гарантирует, что вывод использует UTF-8 в качестве кодировки вместо ASCII по умолчанию (обратите внимание наencoding='utf-8'
):Пример использования:
источник
BeautifulSoup имеет простой в использовании
prettify()
метод.Он отступает один пробел на уровень отступа. Он работает намного лучше, чем lxml's pretty_print, и он короткий и приятный.
источник
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Если у вас есть,
xmllint
вы можете создать подпроцесс и использовать его.xmllint --format <file>
Pretty-печатает свой входной XML в стандартный вывод.Обратите внимание, что этот метод использует внешнюю по отношению к python программу, что делает его своего рода хаком.
источник
Я попытался отредактировать ответ "ade" выше, но переполнение стека не позволило мне редактировать после того, как я первоначально предоставил отзыв анонимно. Это менее глючная версия функции для красивой печати ElementTree.
источник
Если вы используете реализацию DOM, у каждого есть своя собственная форма встроенной симпатичной печати:
Если вы используете что-то другое без собственного симпатичного принтера - или эти симпатичные принтеры делают это не совсем так, как вы хотите - вам, вероятно, придется написать или создать подкласс своего собственного сериализатора.
источник
У меня были некоторые проблемы с красивой печатью минидома. Я получал UnicodeError всякий раз, когда пытался печатать документ с символами за пределами заданной кодировки, например, если в документе была буква β, и я пытался
doc.toprettyxml(encoding='latin-1')
. Вот мой обходной путь для этого:источник
Он не будет добавлять пробелы или переводы строк внутри текстовых узлов, если вы не попросите об этом с помощью:
Вы можете указать, какой должна быть единица отступа и как должен выглядеть перевод строки.
Документ находится на домашней странице http://www.yattag.org .
источник
Я написал решение, чтобы пройтись по существующему ElementTree и использовать text / tail для отступа, как обычно ожидают.
источник
Довольно неплохо выглядит XML для python для этой задачи. (Также назван соответствующим образом.)
Альтернативой является использование pyXML , который имеет функцию PrettyPrint .
источник
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Думаю, этот проект сейчас на чердаке, позор.Вы можете использовать популярную внешнюю библиотеку xmltodict ,
unparse
иpretty=True
вы получите лучший результат:full_document=False
против<?xml version="1.0" encoding="UTF-8"?>
наверху.источник
Вот решение Python3, которое избавляет от уродливой проблемы новой строки (тонны пробелов) и использует только стандартные библиотеки в отличие от большинства других реализаций.
Я нашел, как исправить общую проблему с новой строкой здесь .
источник
Взгляните на модуль vkbeautify .
Это Python-версия моего очень популярного плагина javascript / nodejs с тем же именем. Он может красиво печатать / минимизировать текст XML, JSON и CSS. Ввод и вывод могут быть строки / файла в любых комбинациях. Это очень компактно и не имеет никакой зависимости.
Примеры :
источник
В качестве альтернативы, если вы не хотите повторной обработки, есть библиотека xmlpp.py с
get_pprint()
функцией. Это хорошо и без проблем работало для моих сценариев использования, без необходимости повторной обработки объекта lxml ElementTree.источник
Вы можете попробовать этот вариант ...
Устанавливаем
BeautifulSoup
и бэкэндlxml
(парсер) библиотеки:Обработайте ваш XML-документ:
источник
'lxml'
использует анализатор HTML lxml - см. документацию BS4 . Вам нужен'xml'
или'lxml-xml'
для парсера XML.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
), а затем они продолжили понижать его в тот же день. Я подал официальную жалобу в S / O, но они отказались расследовать. Во всяком случае, я с тех пор «деформировал» свой ответ, который теперь снова верен (и указывает,lxml-xml
как это было изначально). Спасибо.У меня была эта проблема, и я решил ее так:
В моем коде этот метод называется так:
Это работает только потому, что etree по умолчанию использует
two spaces
отступ, что, по-моему, не особо подчеркивает отступ и поэтому не очень красиво. Я не мог указать какую-либо настройку для etree или параметр для любой функции, чтобы изменить стандартный отступ etree. Мне нравится, как легко использовать etree, но это меня очень раздражало.источник
Для преобразования всего XML-документа в красивый XML-документ
(например, если вы распаковали [unzipped] файл LibreOffice Writer .odt или .ods и хотите преобразовать уродливый файл "content.xml" в симпатичный файл для автоматизированный контроль версий GIT и
git difftool
ИНГИ из .odt / файлы .ods , такие , как я реализация здесь )Рекомендации:
- Спасибо ответу Бена Ноланда на этой странице, который помог мне пройти большую часть пути.
источник
Это хорошо работает для XML с китайским!
источник
Если по какой-то причине вы не можете заполучить какой-либо из модулей Python, упомянутых другими пользователями, я предлагаю следующее решение для Python 2.7:
Насколько я знаю, это решение будет работать на Unix-системах, в которых
xmllint
установлен пакет.источник
check_output
что вам не нужно проверять ошибкиЯ решил это с помощью нескольких строк кода, открыв файл, пройдя через него и добавив отступы, а затем сохранив его снова. Я работал с небольшими XML-файлами и не хотел добавлять зависимости или дополнительные библиотеки для установки для пользователя. Во всяком случае, вот что я закончил:
Это работает для меня, возможно, кто-то будет использовать его :)
источник