Проблема с новыми строками, когда я использую toprettyxml()
В настоящее время я использую функцию toprettyxml() модуля xml.dom в python script, и у меня есть некоторые проблемы с новыми символами.
Если не использовать параметр newl или использовать toprettyxml (newl = '\n'), на самом деле он отображает несколько новых строк вместо одного.
Например
f = open(filename, 'w')
f.write(dom1.toprettyxml(encoding='UTF-8'))
f.close()
отображается:
<params>
<param name="Level" value="#LEVEL#"/>
<param name="Code" value="281"/>
</params>
Кто-нибудь знает, откуда эта проблема, и как я могу ее использовать?
FYI Я использую Python 2.6.1
Ответы
Ответ 1
toprettyxml()
довольно ужасен. Это не вопрос Windows и "\ r\n". Попытка любой строки в качестве параметра newl
показывает, что добавляется слишком много строк. Не только это, но и другие пробелы (которые могут вызывать проблемы при чтении машиной xml).
Некоторые обходные пути доступны на сайте
http://ronrothman.com/public/leftbraned/xml-dom-minidom-toprettyxml-and-silly-whitespace
Ответ 2
toprettyxml(newl='')
работает для меня в Windows.
Ответ 3
Я нашел еще одно отличное решение:
f = open(filename, 'w')
dom_string = dom1.toprettyxml(encoding='UTF-8')
dom_string = os.linesep.join([s for s in dom_string.splitlines() if s.strip()])
f.write(dom_string)
f.close()
Выше решение в основном удаляет ненужные строки новой строки из dom_string, которые генерируются методом toprettyxml().
Входы, взятые из → Что такое быстрый однострочный шрифт для удаления пустых строк из строки python?
Ответ 4
Если вы не против установки новых пакетов, попробуйте beautifulsoup. У меня был очень хороший опыт с xml prettyfier.
Ответ 5
Это довольно старый вопрос, но, я думаю, я знаю, в чем проблема:
Minidoms pretty print имеет довольно прямой метод. Он просто добавляет символы, которые вы указали в качестве аргументов. Это означает, что он будет дублировать символы, если они уже существуют.
например. если вы проанализируете XML файл, который выглядит следующим образом:
<parent>
<child>
Some text
</child>
</parent>
в пределах dom уже есть символы новой строки и отступы. Они воспринимаются как текстовые узлы по минидому и все еще существуют, когда вы разбираете его в объект dom.
Если вы перейдете к преобразованию dom-объекта в строку XML, эти текстовые узлы все равно будут находиться. Значение новых символов линии и вкладок отступа все еще остается. Используя довольно печатную версию, просто добавьте больше новых строк и больше вкладок. Поэтому в этом случае не использовать довольно печатную печать или указать newl=''
приведет к желаемому результату.
Однако вы создаете dom в своем script, текстовых узлов там не будет, поэтому довольно печатная версия с newl='\r\n'
и/или addindent='\t'
окажется довольно красивой.
TL; DR Отступы и символы новой строки остаются в синтаксическом анализе, и довольно печатная версия добавляет больше
Ответ 6
Вы просматриваете полученный файл в Windows? Если да, попробуйте использовать toprettyxml(newl='\r\n')
.