Python lxml с использованием xi: include с несколькими фрагментами Xml - PullRequest
4 голосов
/ 12 января 2012

Я занимаюсь разработкой простого класса xml logfile с использованием lxml в Python.

До сих пор я использовал два файла.Правильно сформированный файл 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: include в моем правильно сформированном XML-файле ('logfile.xml').Это работает , но , только если есть один элемент <event>, являющийся фрагментом XML ('events.xml')

Мой код Python:

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.

1 Ответ

3 голосов
/ 12 января 2012

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

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

...