python - 通过 lxml.etree.iterparse 解析单个文件中的多个 XML 声明

标签 python xml lxml elementtree

我需要解析一个包含各种 XML 文件的文件,即 .. 等等。使用 etree.iterparse 时,出现以下(正确的)错误:

lxml.etree.XMLSyntaxError: XML declaration allowed only at the start of the document

现在,我可以预处理输入文件并为每个包含的 XML 文件生成一个单独的文件。这可能是最简单的解决方案。但我想知道是否存在针对此“问题”的适当解决方案。

谢谢!

最佳答案

您提供的样本数据表明存在一个问题,而您提供的问题和异常则表明存在另一个问题。您是否有多个 XML 文档连接在一起,每个文档都有自己的 XML 声明,或者您是否有一个包含多个顶级元素的 XML 片段?

如果是前者,那么解决方案将涉及将输入流分成多个流,然后分别解析每个流。正如一条评论所暗示的那样,这并不一定意味着实现 XML 解析器。您可以在字符串中搜索 XML 声明,而无需解析其中的任何其他内容,只要您的输入不包括包含未转义 XML 声明的 CDATA 部分。您可以编写一个类似文件的对象,它从底层流返回字符,直到它遇到 XML 声明,然后将它包装在一个生成器函数中,该函数在到达 EOF 之前一直返回流。这不是微不足道的,但也不是非常困难。

如果您有一个包含多个顶级元素的 XML 片段,您可以将它们包装成一个 XML 元素并解析整个元素。

当然,对于涉及错误 XML 输入的大多数问题,最简单的解决方案可能只是修复产生错误输入的问题。

关于python - 通过 lxml.etree.iterparse 解析单个文件中的多个 XML 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5651219/

相关文章:

python - 如何在 numpy 中始终对 XX.5 进行舍入

python - Plone - 覆盖 Zope 架构字段

java - 没有标题的 DialogFragment 缩小对话框宽度

python - 多线程可加快下载速度

python - 使用 xpath 给定相邻节点的文本,获取 XML 节点的文本

python - 是否有类似其他语言(Java、Lisp、Haskell、Go 等)的 Stackless Python 项目?

python - 使用 Python 抓取 Google 网页时,总是得不到足够的图像和重复的图像?

java - Log4j 1.2.15 表达式过滤器正则表达式

xml - 一个 XML 模式可以有多个 targetNameSpaces 吗?

python - lxml - 获取元素的平面列表