2009-06-09 47 views
1

我正在使用lxml来处理一些现有的XML文档,并且我想尽可能少地引入差异噪声。不幸的是默认lxml.etree.XMLParser文档的根元素之前或之后不保留空白:如何让lxml的解析器保留根元素之外的空白空间?

>>> xml = '\n <etaoin>shrdlu</etaoin>\n' 
>>> lxml.etree.tostring(lxml.etree.fromstring(xml)) 
'<etaoin>shrdlu</etaoin>' 
>>> lxml.etree.tostring(lxml.etree.fromstring(xml)) == xml 
False 

这可能使用LXML?它是否支持底层的libxml2?

回答

0

用正则表达式捕获空白,并在完成后将其添加回字符串。

+0

我在寻找同样问题的解决方案时偶然发现了这个答案。但我不明白;你将如何实现这个目标?例如,如果更改引入了新的属性或者在其中添加了一个带有空格的字符串?你将如何恢复空白? – flodin 2010-11-07 20:57:34

1

我不知道任何XML库会为你做。但是,如果你真的需要这样做,使用正则表达式听起来像一个体面的想法。

>>> xml = '\n <etaoin>shrdlu</etaoin>\n' 
>>> head, tail = re.findall(r"^\s*|\s*$", xml)[:2] 
>>> root = etree.fromstring(xml) 
>>> out = head + etree.tostring(root) + tail 
>>> out == xml 
True