【问题标题】:why Element tree in python adds extra new lines and spaces in XML为什么 python 中的元素树在 XML 中添加了额外的新行和空格
【发布时间】:2015-12-29 16:18:47
【问题描述】:

我怎样才能改变我的xml的外观例如

 <root>
     <elem1>
         <value>
            122
         </value>
         <text>
            This_is_just_a_text
         </text>
     </elem1>
     <elem1>
         <value>
            122
         </value>
         <text>
            This_is_just_a_text
         </text>
     </elem1>   
 </root>

看起来像:

 <root>
     <elem1>
         <value>122</value>
         <text>This_is_just_a_text</text>
     </elem1>
     <elem1>
         <value>122</value>
         <text>This_is_just_a_text</text>
     </elem1>   
 </root>

我只是想知道发生这种情况的原因是什么?顺便说一下,下面的方法/函数用于添加缩进!

 def prettify(elem):
     """
         Return a pretty-printed XML string for the Element.
     """
     rough_string = ET.tostring(elem, 'utf-8')
     reparsed = minidom.parseString(rough_string)
     return reparsed.toprettyxml(indent="\t")

【问题讨论】:

  • 当子元素是叶子时,你想将元素打印在一行中——这是你的美感还是什么原因?如果文本很长,你永远看不到结束标签怎么办。具有相同缩进级别的一个元素的开始和结束标记完全有意义。像男人一样对待它或给出任何改变外观的理由;)

标签: python xml python-2.7 python-3.x elementtree


【解决方案1】:

我写这个答案只是为了那些有一天可能会遇到同样问题的人。

这是我发现的!在 python2.7.3 之前的所有 python 版本的内置方法 toprettyxml() 中实际上存在一个错误,这个错误导致在您的 xml 输出中添加冗余空格和新行。因此,如果您有 python 2.7.3 或更高版本,则可以使用问题中提供的 prettify() 方法,并且您不应该看到任何额外的行或空格,但是如果您使用的是旧版本,那么这是一种修复它的方法使用“正则表达式”:

 def prettify(elem):
     """
         Return a pretty-printed XML string for the Element.
     """
     rough_string = ET.tostring(elem, 'utf-8')
     reparsed = minidom.parseString(rough_string)
     uglyXml = reparsed.toprettyxml(indent="\t")
     pattern = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)
     return pattern.sub('>\g<1></', uglyXml) 

Pretty printing XML in Python

【讨论】:

    【解决方案2】:

    元素将其包含的文本保存在常规 str 中,因此您可以调用 str.strip() 来删除不需要的空格。

    import xml.etree.ElementTree as ET
    import xml.dom.minidom as minidom
    
    def prettify(elem):
         """
             Return a pretty-printed XML string for the Element.
         """
         rough_string = ET.tostring(elem, 'utf-8')
         reparsed = minidom.parseString(rough_string)
         return reparsed.toprettyxml(indent="\t")
    
    def strip(elem):
        for elem in elem.iter():
            if(elem.text):
                elem.text = elem.text.strip()
            if(elem.tail):
                elem.tail = elem.tail.strip()
    
    xml = ET.XML('''<elem1>
             <value>
                122
             </value>
             <text>
                This_is_just_a_text
             </text>
         </elem1>''')
    
    strip(xml)
    print prettify(xml)
    

    结果:

    <?xml version="1.0" ?>
    <elem1>
        <value>122</value>
        <text>This_is_just_a_text</text>
    </elem1>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2023-03-28
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多