XML 打印漂亮的 ElementTree

XML ElementTree with pretty print

1.) 如果您查看以下标签和我的 xml- 输出的空格,您会注意到空格不正确,这是 2.)[=23= 中的代码的原因]

当前输出:

<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-output 中看到错误。

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.) 使用您接下来看到的代码,当它经过 indent() 时,我创建了 ElementTree。

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

我需要编辑 indent() 缩进函数的定义以使空格正确。在那种情况下,我真的不知道如何在标签相等时放回空格。如果你能帮我解决这个问题,我会非常非常高兴。

更新:参见 xml.etree.ElementTree.indent 自 Python 3.9.

我无法重现您示例中的错误缩进,但根据 http://effbot.org/zone/element-lib.htm#prettyprint,您的函数被错误复制了。对于这些行:

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

引号之间应该有两个space:

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 e in elem:
      indent(e, level+1)
    if not e.tail or not e.tail.strip():
      e.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。
  • 剪切粘贴精确代码并输入数据作为文本来重现问题,使答案更容易重现问题问题。