为什么python中的元素树在XML中添加了额外的新行和空格

为什么python中的元素树在XML中添加了额外的新行和空格,python,xml,python-2.7,python-3.x,elementtree,Python,Xml,Python 2.7,Python 3.x,Elementtree,如何更改xml的外观,例如 <root> <elem1> <value> 122 </value> <text> This_is_just_a_text </text> </elem1> <elem1> <value>

如何更改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>

元素将其包含的文本保存在常规的
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.etree.ElementTree作为ET导入
将xml.dom.minidom作为minidom导入
def美化(要素):
"""
为元素返回打印精美的XML字符串。
"""
粗字符串=ET.tostring(元素“utf-8”)
重解析=minidom.parseString(粗字符串)
返回重新解析的.toprettyxml(indent=“\t”)
def带(elem):
对于elem.iter()中的elem:
如果(要素文本):
elem.text=elem.text.strip()
如果(元素尾):
elem.tail=elem.tail.strip()
xml=ET.xml(“”)
122
这只是一段文字
''')
strip(xml)
打印美化(xml)
结果:


122
这只是一段文字

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

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

def美化(elem):
"""
为元素返回打印精美的XML字符串。
"""
粗字符串=ET.tostring(元素“utf-8”)
重解析=minidom.parseString(粗字符串)
uglyXml=repassed.toprettyxml(indent=“\t”)

pattern=re.compile('>\n\s+([^\s].*))\n\s+\g当子元素是一片叶子时,您希望将该元素打印在一行中-这是您的美感还是原因?如果文本很长,您将永远看不到结束标记。具有相同缩进级别的一个元素的开始和结束标记在彼此下方完全有意义。像男人一样对待它或给出任何原因要更改外观;)可能相关:
 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")
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)
 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)