La solution est plus facile en utilisant probablement lxml, où vous pouvez définir une option d'analyseur pour ignorer les espaces entre les éléments:
>>> 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>
Ce sera probablement suffisant pour vos besoins, mais quelques avertissements pour être sur le coffre-fort côté:
Cela vient de supprimer des nœuds blancs entre les éléments, et essayez de ne pas supprimer des nœuds blancs dans les éléments avec un contenu mixte:
>>> 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>
Les espaces de début ou de fin provenant de textnodes ne seront pas supprimés. Cependant, dans certaines circonstances, il supprimera encore les nœuds d'espace blanc du contenu mixte: si l'analyseur n'a pas encore rencontré de nœuds non-blancs à ce niveau.
>>> 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>
Si vous ne voulez pas, vous pouvez utiliser xml:space="preserve"
, qui sera respectée. Une autre option utiliserait un dtd et utiliserait etree.XMLParser(load_dtd=True)
, où l'analyseur utiliserait le dtd pour déterminer quels nœuds d'espace sont significatifs ou non.
Autre que cela, vous devrez écrire votre propre code pour supprimer l'espace que vous ne voulez pas (descendants itérer, et où les propriétés appropriées, définissez .text
et .tail
qui ne contiennent que des espaces à None
ou chaîne vide)
Cela peut aider à l'aide lxml pour supprimer toutes les lignes vides et-espaces blancs à partir du noeud texte http://stackoverflow.com/a/19396130/973699 – DevC