2015-10-01 33 views
2

额外的新线条和空间我怎样才能改变我的XML的外观例如从为什么元素蟒蛇树中添加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") 
+0

当子元素是要打印的元素在一行叶 - 这是你的美感或者是什么原因?如果文本很长,你永远不会看到结束标记。使用相同的缩进级别打开和关闭一个元素下方的标记完全可以理解。拿它像一个男人或给出任何理由为什么要改变外观;) – rebeling

+0

可能相关:http://stackoverflow.com/questions/3310614/remove-whitespaces-in-xml-string –

回答

1

我在写这个答案只对那些谁可能有同样的问题一天。

这里我发现了!在python2.7.3之前,所有python版本的内置方法toprettyxml()中实际上存在一个bug,这个bug导致在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

5

元素持有正规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>