使用xi的Python lxml:包含多个Xml片段

时间:2012-01-11 22:40:14

标签: python lxml xinclude

我正在使用Python中的lxml开发一个简单的xml日志文件类。

到目前为止,我的方法是使用两个文件。格式良好的XML文件,其中包含第二个文件,该文件是XML片段。我正在使用xi:include元素。通过简单地将<event>元素附加到文件末尾,可以有效地更新XML片段。

格式良好的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方法在我的格式良好的XML文件('logfile.xml')中处理xi:include元素。仅当有一个<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 个答案:

答案 0 :(得分:3)

xi:xinclude 引用的文档必须一个完整的xml文档(“完整的xml信息集”)。您的events.xml不是有效的xml文档,因为您没有包含元素的单个根。

您可以使用xpointer属性仅包含一个子集来选择事件元素。但是,我不确定lxml是否支持此属性。