最简单的解决方案可能是使用lxml,您可以在其中设置解析器选项以忽略元素之间的空白:
>>> from lxml import etree
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> xml_str = '''<root>
>>> <head></head>
>>> <content></content>
>>> </root>'''
>>> elem = etree.XML(xml_str, parser=parser)
>>> print etree.tostring(elem)
<root><head/><content/></root>
这可能足以满足您的需求,但为了安全起见,请注意一些警告:
这只会删除元素之间的空白节点,并尽量不要删除具有混合内容的元素内部的空白节点:
>>> elem = etree.XML('<p> spam <a>ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p> spam <a>ham</a> <a>eggs</a></p>
不会删除来自文本节点的前导或尾随空格。然而,在某些情况下,它仍然会从混合内容中删除空白节点:如果解析器尚未在该级别遇到非空白节点。
>>> elem = etree.XML('<p><a> ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p><a> ham</a><a>eggs</a></p>
如果你不想这样,你可以使用xml:space="preserve"
,这将受到尊重。另一种选择是使用 dtd 和 use etree.XMLParser(load_dtd=True)
,其中解析器将使用 dtd 来确定哪些空白节点是重要的或不重要的。
除此之外,您必须编写自己的代码来删除您不想要的空格(迭代后代,并在适当的情况下,设置.text
和.tail
属性仅包含空格None
或空字符串)