Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 29, 2015 13:56:58

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

Создаётся файл, но все тэги в одну строку (если открыть простым текстовым редактором-блокнотом):

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

А хочу так:

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

Какая команда или параметр за это ответственны? И умеет ли, вообще, lxml так делать?

Офлайн

#2 Июнь 29, 2015 15:13:01

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

нужно использовать pretty_print=True

outFile = open('test.xml', 'w')
doc.write(outFile, pretty_print=True)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Июнь 29, 2015 15:13:16)

Офлайн

#3 Июнь 30, 2015 06:27:27

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

 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?

Отредактировано Pluto (Июнь 30, 2015 06:27:53)

Офлайн

#4 Июнь 30, 2015 06:52:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

xmldeclaration = etree.tostring(root, encoding = "Windows-1251", standalone = "Yes", pretty_print = True)



Офлайн

#5 Июнь 30, 2015 07:01:31

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

На данный параметр lxml не ругается, но как были тэги в одну строку, так остались.

Офлайн

#6 Июнь 30, 2015 07:08:51

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

Странно. Вот так будет работать, но это какой-то кривой костыль.

import xml.dom.minidom
xml = xml.dom.minidom.parseString("<MAINTAG><TAG1></TAG1></MAINTAG>")
with open("asxcas.xml", 'wb') as outfile:
    outfile.write(xml.toprettyxml())



Офлайн

#7 Июнь 30, 2015 08:10:43

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

Да уж. Создать xml, затем его отпарсить, и заново записать.
Блин, мне нужен “красивый” xml

Офлайн

#8 Июнь 30, 2015 08:32:08

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

Pluto
Блин, мне нужен “красивый” xml
Красивое решение дано выше.
Пример из официального туториала
Почему у вас не работает я не знаю, проверьте актуальность библиотеки.



Офлайн

#9 Июнь 30, 2015 08:41:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

>>> 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 делает не то.)



Отредактировано py.user.next (Июнь 30, 2015 08:43:15)

Офлайн

#10 Июнь 30, 2015 21:30:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Python 3. Lxml. Как пару (открывающий/закрывающий) тэгов разместить на разных строках?

Обычно форматирую xml если его смотрю глазами в редакторе. А редактор обычно умеет форматировать xml и без Питона. например в sublime text можно поставить пакет indent xml ну так далее. Если пишу документы массово то это стараюсь формат xml не использовать. Поэтому программное форматирование xml оказалось для меня не актуально.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version