Проблема с новыми строками, когда я использую 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').