我正在使用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> element是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片段文档的末尾.
解决方法:
xi:xinclude引用的文档必须是完整的xml文档(“完整的xml信息集”).您的events.xml不是有效的xml文档,因为您没有包含单个根的元素.
您可以通过使用xpointer属性选择事件元素来仅包含子集.但是,我不确定lxml是否支持此属性.