Переформатирование XML для стандартизации вкладок / отступов - PullRequest
0 голосов
/ 05 октября 2019

У меня есть XML-файл, который должен быть напечатан для потребления человеком. В течение многих лет мы вносили изменения с помощью xmlspy и использовали его функцию gridview, чтобы стандартизировать отступы перед проверкой на git. Я не хочу привязывать пользователей к этой программе, поэтому планировал добавить сценарий python для запуска при регистрации, который будет читать в xml-файле, переформатировать его с использованием стандартных отступов, а затем записать это в файл, который будет зарегистрирован. Я использовал приведенный ниже код, который приведен ниже во многих ответах на подобные вопросы. Это может работать нормально, если ваш xml-файл не имеет tabs и carriage-returns, однако, кажется, что он не затрагивает форматирование, которое уже существует. Например, если мой xml-файл выглядит следующим образом, я хочу, чтобы <Grape> был помещен в строку, но на самом деле этого не происходит в моих выходных данных. <Grape> имеет дополнительные отступы в выходном файле

Пример

<Fruit>
  <Apple/>
     <Grape/>
  <Pear/>
</Fruit>

Код

import lxml.etree as etree
output_file = open("output.txt", "w")
parsed_file = etree.parse("input.xml")
parsed_bytes = (etree.tostring(parsed_file, pretty_print=True, encoding="unicode"))
output_file.write(parsed_bytes)

Дополнительная информация Работа с ним более Я думаю, что часть проблемыis pretty_print не вызывается, если у меня есть какие-либо табуляции / пробелы в mt xml. Если мой исходный файл предварительно вырезан, то симпатичная печать работает нормально, но если я разделю это на две строки, это не будет хорошо печататься.

 <Fruit><Apple/><Grape/><Pear/></Fruit>

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Требовалась настройка парсера remove_blank_text

import lxml.etree as etree
output_file = open("output.xml", "w")

parser = etree.XMLParser(remove_blank_text=True) 
parsed_file = etree.parse("inputstrong text.xml", parser)
parsed_bytes = (etree.tostring(parsed_file, pretty_print=True))
parsed_string = str(parsed_bytes, 'utf-8')
output_file.write(parsed_string)
0 голосов
/ 05 октября 2019

<2> не в строке, потому что вы не предоставили правильно сформированный XML-код. Чтобы сделать ваш код XML правильно сформированным , вы должны преобразовать его в нечто вроде этого:

<Numbers>
  <1 />
  <2 />
  <3 />
</Numbers>

или

<Numbers>
  <1>
     <2 />
  </1>
  <3 />
</Numbers>

Наконец:
Согласно спецификации XML v1.1 NTName не может начинаться с цифры. Он должен начинаться с NameStartChar (но я полагаю, что ваша схема именования была только в иллюстративных целях).

Принимая все это во внимание, результат должен быть ожидаемым.

...