La soluzione più semplice probabilmente sta usando lxml, in cui è possibile impostare un'opzione di parser di ignorare gli spazi bianchi tra gli elementi:
>>> 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>
Questo sarà probabilmente sufficiente per le vostre esigenze, ma alcune avvertenze per essere al sicuro lato:
Questo sarà solo rimuovere nodi spazi vuoti tra gli elementi, e cercare di non rimuovere nodi spazi bianchi all'interno elementi con contenuto misto:
>>> 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>
Gli spazi bianchi iniziali o finali dai textnode non verranno rimossi. Rimarrà comunque in alcune circostanze rimuovere i nodi dello spazio bianco dal contenuto misto: se il parser non ha ancora incontrato nodi non spazi bianchi a quel livello.
>>> 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>
Se non si desidera che, è possibile utilizzare xml:space="preserve"
, che sarà rispettato. Un'altra opzione sarebbe utilizzare un dtd e utilizzare etree.XMLParser(load_dtd=True)
, in cui il parser utilizzerà il dtd per determinare quali nodi di spazi vuoti sono significativi o meno.
Oltre a questo, si dovrà scrivere il proprio codice per rimuovere gli spazi vuoti non si vuole (l'iterazione discendenti, e se del caso, impostare .text
e .tail
proprietà che contengono solo spazi bianchi per None
o stringa vuota)
Questo può aiutare utilizzando lxml per rimuovere tutte le righe vuote e bianche-spazi dal nodo di testo http://stackoverflow.com/a/19396130/973699 – DevC