XML ElementTree with pretty print



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

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

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

更新:参见 Python 3.9 的 xml.etree.ElementTree.indent 版本。

我无法从您的示例中重现错误的缩进,但根据 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 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上进行测试。
  • 剪切粘贴精确的代码并将数据输入为文本以重现问题,以便答案轻松重现问题。

最新更新