2009-06-09 5 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

+0

Этот ответ не обрабатывает эти случаи. Если вы измените структуру DOM, значение «сохранить пробел» станет грязным. Чтобы справиться с структурными изменениями, вы действительно хотите перестроить пробелы, а не восстанавливать их. – SpliFF

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 

 Смежные вопросы

  • Нет связанных вопросов^_^