2014-11-29 1 views
2

Я пытаюсь извлечь некоторую информацию из входного XML-файла и распечатать его в выходной файл с помощью команд lxml и xpath. Я получаю проблемы при чтении XML-тег, как следующийкак сохранить & при анализе xml-файла с использованием lxml и xpath

... 
<editor> Barnes &amp; Nobel </editor> 
... 

Для того, чтобы разобрать файл XML и распечатать содержимое редактора я использую (всегда есть только один редактор в XML):

parser = etree.XMLParser(encoding='utf-8') 
docTree = etree.parse(io.BytesIO(open(inputXML, "r").read()), parser) 
print docTree.xpath('//editor')[0].text 

Моя проблема заключается в том, что &amp; в какой-то момент преобразуется в '&', что испортит мою дальнейшую обработку.

Как я могу гарантировать, что символ &amp; не будет «декодирован»?

+1

Параметр '&' является частью формата * * XML, а не часть данных. Это похоже на просьбу сохранить данные в кодировке UTF-8. Если вы хотите вернуться, просто выйдите из данных самостоятельно. –

+0

Что дальше обрабатывается? Если вы создаете вывод HTML, используйте подходящую библиотеку шаблонов HTML, которая, например, обрабатывает выходное экранирование. –

+0

@MartijnPieters, тогда я предполагаю, что вы предлагаете что-то вроде docTree = etree.parse (io.BytesIO (open (inputXML, «r»). Read(). Replace («&», «\ &»)), парсер)? – XAnguera

ответ

2

Я знаю, это будет звучать самонадеянно, но вы хотите, чтобы данные были "&". Это текстовое содержимое элемента XML. Если у вас есть последующая обработка, которая нуждается как "&amp;", то вам нужен сделать шаг, который будет xml- (или HTML-) закодировать его обратно "&amp;",

Вы не можете задать XML-парсер для разбора документа и не превратить "&amp;" в "&". Он этого не сделает.

+0

Спасибо @Ned за ваш ответ. Все, что я хочу, это то, что на выходе сохраняется то же содержимое, что и вход. Я использую lxml, чтобы сообщить мне, какой текст существует внутри данного тега, но я не хочу, чтобы он ничего не делал с текстом. Можете ли вы предложить надежное решение? – XAnguera

+0

Если вы используете lxml для вывода XML снова, он вернет '&' обратно в '&'. Вам нужно понять, какие инструменты у вас есть. –

-1

я, наконец, нашел ответ на свой вопрос в ответе How do I escape ampersands in XML so they are rendered as entities in HTML? В моем коде я добавил промежуточный шаг, чтобы гарантировать, что все & символы остаются неизменными на выходе. Это

parser = etree.XMLParser(encoding='utf-8') 
xmlText = open(inputXML, "r").read().replace("&amp;", "&amp;amp;") 
docTree = etree.parse(io.BytesIO(xmlText), parser) 
print docTree.xpath('//editor')[0].text 

В самом деле, только в случае, я применил тот же рецепт для других возможных объектов в XML, как это определено в http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined%5Fentities%5Fin%5FXML

+0

Этот шаг не нужен. LXML объединит ваши данные без коррупции. –

+0

@NedBatchelder нет :(try 't = et.fromstring (" ' "); print (et.tostring (t))'. Он печатает 'b ''" '. Он работает с '&' хотя –

+0

@CiprianTomoiaga Я не вижу, как это является коррупцией. Это эквивалентные представления тех же XML-данных. –

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