Найти - Пользователи
Полная версия: Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?
Начало » Python для новичков » Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?
1
Pluto
Создаётся файл, но все тэги в одну строку (если открыть простым текстовым редактором-блокнотом):

<MAINTAG><TAG1></TAG1></MAINTAG>

А хочу так:

<MAINTAG>
    <TAG1>
    </TAG1>
</MAINTAG>

Какая команда или параметр за это ответственны? И умеет ли, вообще, lxml так делать?
terabayt
нужно использовать pretty_print=True
outFile = open('test.xml', 'w')
doc.write(outFile, pretty_print=True)
Pluto
 root = etree.Element("ROOT")
 doc = etree.ElementTree(root)
 xmldeclaration = etree.tostring(root, encoding = "Windows-1251", standalone = "Yes") 
outfile = open(fullPathName, 'wb') 
outfile.write(xmldeclaration)
outfile.close()

У меня запись файла несколько по-другому происходит. Куда тут засунуть этот pretty_print?
FishHook
xmldeclaration = etree.tostring(root, encoding = "Windows-1251", standalone = "Yes", pretty_print = True)
Pluto
На данный параметр lxml не ругается, но как были тэги в одну строку, так остались.
FishHook
Странно. Вот так будет работать, но это какой-то кривой костыль.
import xml.dom.minidom
xml = xml.dom.minidom.parseString("<MAINTAG><TAG1></TAG1></MAINTAG>")
with open("asxcas.xml", 'wb') as outfile:
    outfile.write(xml.toprettyxml())
Pluto
Да уж. Создать xml, затем его отпарсить, и заново записать.
Блин, мне нужен “красивый” xml
FishHook
Pluto
Блин, мне нужен “красивый” xml
Красивое решение дано выше.
Пример из официального туториала
Почему у вас не работает я не знаю, проверьте актуальность библиотеки.
py.user.next
>>> import lxml.etree
>>> 
>>> def f(s):
...     return lxml.etree.tostring(
...         lxml.etree.fromstring(s),
...         pretty_print=True,
...         encoding='unicode')
... 
>>> s = '<MAINTAG><TAG1><TAG11>text11</TAG11></TAG1>' \
...     '<TAG2><TAG21>text21</TAG21></TAG2></MAINTAG>'
>>> 
>>> print(f(s))
<MAINTAG>
  <TAG1>
    <TAG11>text11</TAG11>
  </TAG1>
  <TAG2>
    <TAG21>text21</TAG21>
  </TAG2>
</MAINTAG>
>>>

Pluto
А хочу так:
Кстати, несложно написать функцию, которая сама форматирует XML так, как надо. (Иногда pretty_print делает не то.)
doza_and
Обычно форматирую xml если его смотрю глазами в редакторе. А редактор обычно умеет форматировать xml и без Питона. например в sublime text можно поставить пакет indent xml ну так далее. Если пишу документы массово то это стараюсь формат xml не использовать. Поэтому программное форматирование xml оказалось для меня не актуально.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB