使用Python在XML节点之间剥离空格

时间:2009-07-08 13:34:20

标签: python xml xslt

有没有一种简单的方法可以在Python中完成同样的事情,因为xsl完成了:

<xsl:strip-space elements="*"/>

例如在下面的

for event, elem in ElementTree.iterparse("/tmp/example.xml"):
    if elem.tag == "example":
        print ElementTree.tostring(elem)

当打印出示例节点时,示例节点的子节点之间的输入文件中的所有空格和换行符都将被删除?

3 个答案:

答案 0 :(得分:4)

我相信你需要明确地操纵子树去除每个文本和尾部:

from xml.etree import ElementTree

for event, elem in ElementTree.iterparse("/tmp/example.xml"):
    if elem.tag == "example":
        subiter = ElementTree.ElementTree(elem).getiterator()
        for x in subiter:
          if x.text: x.text = x.text.strip()
          if x.tail: x.tail = x.tail.strip()
        print ElementTree.tostring(elem)

答案 1 :(得分:3)

如果您可以使用lxml模块,这将变得更加容易。来自the lxml tutorial

>>> parser = etree.XMLParser(remove_blank_text=True) # lxml.etree only!
>>> root = etree.XML("<root>  <a/>   <b>  </b>     </root>", parser)
>>> etree.tostring(root)
b'<root><a/><b>  </b></root>'

答案 2 :(得分:1)

一个优雅的解决方案可以有一个迭代器,它只是过滤掉只有空格的文本节点:

import re

whitespaces = re.compile('\s*$')
def omit_whitespaces(iter):
    for event, elem in iter:
        if whitespaces.match(elem.text): elem.text = ''
        if whitespaces.match(elem.tail): elem.tail = ''
        yield event, elem

def strip_whitespaces(iter):
    for event, elem in iter:
        elem.text = elem.text.strip()
        elem.tail = elem.tail.strip()
        yield event, elem

然后按如下方式使用它(stripomit,具体取决于您是否要在具有非空白字符的文本节点中保留空格):

for event, elem in omit_whitespaces(ElementTree.iterparse("/tmp/example.xml")):
    if elem.tag == "example":
        print ElementTree.tostring(elem)

请注意,在这种情况下,您只能使用'end'事件(否则解析器可以为您提供部分数据)。

但是......我并不太了解ElementTree,但我没有测试过这段代码。