簡體   English   中英

XML ElementTree打印精美

[英]XML ElementTree with pretty print

1.)如果您查看以下標簽和我的xml-output的空格,您會注意到空格不正確,這是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-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()縮進函數的定義以獲取正確的空格。 在那種情況下,我真的不知道當標簽相等時如何退回空格。 如果您能幫助我解決該問題,我將非常高興。

我無法從您的示例中復制錯誤的縮進,但是根據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上進行測試。
  • 剪切n粘貼准確的代碼,並以文本形式輸入數據以重現問題,從而使答案很容易重現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM