通过lxml.etree.iterpars

2024-06-28 20:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要分析包含各种XML文件的文件,即<;XML>;<;/XML>;<;XML>;<;/XML>。。等等。使用时etree.iterparse公司,我得到以下(正确)错误:

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

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

谢谢!在


Tags: 文件theltgtonly错误公司xml
2条回答

您提供的示例数据表明了一个问题,而您提供的问题和异常则暗示了另一个问题。您是将多个XML文档连接在一起,每个文档都有自己的XML声明,还是有一个包含多个顶级元素的XML片段?在

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

如果有一个包含多个顶级元素的XML片段,只需将它们包装为一个XML元素并解析整个过程。在

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

我用正则表达式来解决这个问题。假设每个文档都包含一个处理多个文档的xml函数。执行此循环后,数据将为空,或包含不完整的XML文档,并且句柄函数将被调用零次或多次。在

while True:
  match = re.match (r'''
        \s*                 # ignore leading whitespace
        (                   # start first group
          <(?P<TAG>\S+).*?> # opening tag (with optional attributes)
            .*?             # stuff in the middle
          </(?P=TAG)>       # closing tag
        )                   # end of first xml document
        (?P<REM>.*)         # anything else
      ''',
    data, re.DOTALL | re.VERBOSE)
  if not match:
    break
  document = match.group (1)
  handle (document)
  data = match.group ('REM')

相关问题 更多 >