XML ElementTree с красивым принтом - PullRequest
0 голосов
/ 01 октября 2018

1.) Если вы посмотрите на следующие теги и пробелы в моем xml-выводе, вы заметите, что пробелы не так корректны, причина кода в 2.)

  • <SD-ID-Gesamt> & </SD-ID-Gesamt>
  • <Lage> & </Lage>
  • <Parameter> & </Parameter>

Токовый выход:

<SD-ID-Gesart>
    <SD-ID-Code>
        <SD-ID>DD-RE-1.0G-10</SD-ID>
        <Lage>
            <XP>14.84</XP>
            <YP>73.19</YP>
            <ZP>7.92</ZP>
            <WKS>95.32</WKS>
            </Lage>
        <Parameter>
            <Form>Rectangle</Form>
            <Art>Deckendurchbruch/Art>
            <Gewerk>-HT-SAN-DURCHBRUCH</Gewerk>
            <Ebene>1.OG OKFF +4,50 m</Ebene>
            <Breite>1,800000</Breite>
            <Höhe>0,500000</Höhe>
            <Tiefe>0,450000</Tiefe>
            <Status_Neu>0</Status_Neu>
            <Status_Geändert>1</Status_Geändert>
            </Parameter>
    <SD-ID-Code>

2.) Я звоню indent(), чтобы напечатать мои xml-файлы.Это работает почти так, как хотелось бы, за исключением одной маленькой ошибки в коде, который вы видите ниже.Ошибка, которую вы можете увидеть в xml-выводе на картинке выше.

def indent(elem, level=0):
i = "\n" + level*"  "
if len(elem):
    if not elem.text or not elem.text.strip():
        elem.text = i + ""
    if not elem.tail or not elem.tail.strip():
        elem.tail = i
for elem in elem:
    indent(elem, level+1)
    if not elem.tail or not elem.tail.strip():
        elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

3.) С кодом, который вы видите далее, я создаю ElementTree, когда он прошел через indent().

indent(sd)
tree = ET.ElementTree(sd)
tree.write(open(pfad + '\\'+ datei_name + '.xml', "w"), encoding='utf-8', 
xml_declaration=True, method='xml')

Мне нужно отредактировать определение функции отступа indent(), чтобы получить правильные пробелы.В этом случае я действительно не знаю, как вернуть пробелы, когда тег равен.Я был бы очень счастлив, если бы вы могли помочь мне исправить это.

1 Ответ

0 голосов
/ 01 октября 2018

Я не смог воспроизвести неверный отступ из вашего примера, но согласно http://effbot.org/zone/element-lib.htm#prettyprint, ваша функция неправильно скопирована.Для этих строк:

if not elem.text or not elem.text.strip():
    elem.text = i + ""

Между кавычками должно быть два пробела:

if not elem.text or not elem.text.strip():
  elem.text = i + "  "

Я запустил этот код, и он отображается правильно.

from xml.etree import ElementTree as et

def indent(elem, level=0):
  i = "\n" + level*"  "
  if len(elem):
    if not elem.text or not elem.text.strip():
      elem.text = i + "  "
    if not elem.tail or not elem.tail.strip():
      elem.tail = i
    for elem in elem:
      indent(elem, level+1)
    if not elem.tail or not elem.tail.strip():
      elem.tail = i
  else:
    if level and (not elem.tail or not elem.tail.strip()):
      elem.tail = i

data = '''<one><two><three>3</three><four>4</four></two></one>'''
tree = et.fromstring(data)
indent(tree)
et.dump(tree)

Вывод:

<one>
  <two>
    <three>3</three>
    <four>4</four>
  </two>
</one>

Примечания к будущему:

  • Изображения с текстом не могут быть скопированы, поэтому я оставляю это в качестве упражнения для тестирования вашего собственного XML.
  • Cut-n-paste точный код и входные данные в виде текста , чтобы воспроизвести проблему и упростить ответы на нее.
...