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

发布于 2021-01-29 17:31:41

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

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

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

谢谢!

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您提供的样本数据提出了一个问题,而您提供的问题和例外提出了另一个问题。您是否将多个XML文档串联在一起,每个文档都有自己的XML声明,或者您是否具有包含多个顶级元素的XML片段?

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

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

    当然,与涉及不良XML输入的大多数问题一样,最简单的解决方案可能只是修复产生不良输入的问题。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看