通过lxml.etree.iterparse解析单个文件中的多个XML声明
我需要解析一个包含各种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输入的大多数问题一样,最简单的解决方案可能只是修复产生不良输入的问题。