【问题标题】:Python lxml using xi:include with multiple Xml fragmentsPython lxml 使用 xi:include 和多个 Xml 片段
【发布时间】:2012-01-11 22:40:13
【问题描述】:

我正在 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 元素。这工作但只有当有一个&lt;event&gt; 元素是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 片段文档的末尾。

【问题讨论】:

  • 尝试这样做 - 在 events.xml 文件的开头添加 标签,而不是在文件末尾添加 标签。可能这会有所帮助

标签: python lxml xinclude


【解决方案1】:

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

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

【讨论】:

  • lxml 支持 xpointer 属性 ,但这无济于事,因为 OP 希望“事件”文件成为 xml 片段。但正如你所说的那样:不可能。
  • 但他可以在 events.xml 中添加一个 events 根,然后包含 &lt;xi:include href="events.xml" xpointer="xpointer(/events//event)" /&gt; 之类的东西,对吧?
  • 他说他想将&lt;event&gt; 元素直接 附加到events.xml 的末尾,这样就可以排除封闭标记。他尝试使用xinclude 的唯一目的是在&lt;logfile&gt; 根元素中插入一个xml 片段。
  • @ekhumoro - 确切地说,我希望能够通过写入 events.xml 文件的末尾来附加事件。这样,每次我想附加一个事件时,我都不需要解析(并加载到内存中)events.xml。我可以手动为 events.xml 编写一个结束根标记(例如 ),但我想知道是否有更好的方法。
  • 它不像文件追加那么简单,但您不一定需要将整个东西加载到内存中。您可以使用流式解析。见iterparse and iterwalk。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多