2012-01-11 9 views
4

Я разрабатываю простой класс журнала xml, используя lxml в Python.Python lxml с помощью xi: include с несколькими фрагментами Xml

Мой подход до сих пор заключался в использовании двух файлов. Хорошо сформированный XML-файл, который включает в себя второй файл, который является фрагментом XML. Я использую элемент xi: include. Таким образом, XML-фрагмент может быть эффективно обновлен путем простого добавления элементов <event> в конец файла.

Хорошо формируется XML-файл ('logfile.xml') выглядит следующим образом:

<?xml version="1.0"?> 
<logfile> 
<event xmlns:xi="http://www.w3.org/2001/XInclude"> 
    <xi:include href="events.xml"/> 
</event> 
</logfile> 

фрагмента XML ('events.xml') выглядит следующим образом:

<event> 
    <data></data> 
</event> 
<event> 
    <data></data> 
</event> 
<event> 
    <data></data> 
</event> 

Моя цель это в конечном итоге с:

<?xml version="1.0"?> 
<logfile> 
    <event> 
     <data></data> 
    </event> 
    <event> 
     <data></data> 
    </event> 
    <event> 
     <data></data> 
    </event> 
</logfile> 

в Python Я использую метод XInclude обрабатывать XI: включать элемент в моей хорошо сформированной XML фи le ('logfile.xml'). Это работает но только если есть один <event> элемент фрагмент XML ('events.xml')

Мой код питона:

tree = etree.parse('logfile.xml') 
tree.xinclude() 
root = tree.getroot() 
print etree.tostring(self.logfileNode, pretty_print=True, xml_declaration=True, encoding='UTF-8') 

Ошибка Я вижу:

lxml.etree.XIncludeError: Extra content at the end of the document 

Я мог бы содержать события в другом элементе, но это не поддается добавлению данных в конец документа фрагмента XML.

+0

попробуйте сделать это - добавьте тег в начало файла events.xml, а затем добавьте тег в конец файла. может быть, это может помочь – RanRag

ответ

3

Документ, на который ссылается xi:xinclude, должен быть полным документом xml («полный xml infoset»). Ваш events.xml не является допустимым документом xml, потому что у вас нет ни одного элемента, содержащего корень.

Возможно, вы можете включить только подмножество, используя атрибут xpointer, чтобы выбрать элементы события. Однако я не уверен, что lxml поддерживает этот атрибут.

+0

Атрибут 'xpointer' _is_ поддерживается lxml, но это не поможет, потому что OP хочет, чтобы файл событий был фрагментом xml. Но, как вы правильно говорите: этого просто не может быть. – ekhumoro

+0

Но он * мог * добавить корень событий в event.xml и затем включить что-то вроде '', правильно? –

+0

Он говорит, что хочет добавить '' элементов _directly_ в конец 'events.xml', чтобы исключить закрывающий тег. Его единственной целью в попытке использовать 'xinclude' было вставить фрагмент xml в корневой элемент' '. – ekhumoro

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