无法分析Python XML.etree.ElementTree.ParseError中的XML文件

2024-04-24 04:50:38 发布

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

我正在尝试使用Python的XML模块解析XML文件中的信息。问题是,当我指定文件列表并开始解析策略时,在(假定)成功解析第一个文件之后,我得到以下错误:

Parsing 20586908.xml ..
Parsing 20586934.xml ..


Traceback (most recent call last):
  File "<ipython-input-72-0efdae22e237>", line 11, in parse
    xmlTree = ET.parse(xmlFilePath, parser = self.parser)
  File "C:\Users\StefanCepa995\miniconda3\envs\dl4cv\lib\xml\etree\ElementTree.py", line 1202, in parse
    tree.parse(source, parser)
  File "C:\Users\StefanCepa995\miniconda3\envs\dl4cv\lib\xml\etree\ElementTree.py", line 601, in parse
    parser.feed(data)
xml.etree.ElementTree.ParseError: parsing finished: line 1755, column 0

下面是我用来解析XML文件的代码:

class INBreastXMLParser:
    def __init__(self, xmlRootDir):
        self.parser         = ET.XMLParser(encoding="utf-8")
        self.xmlAnnotations = [os.path.join(root, f)
                                   for root, dirs, files in os.walk(xmlRootDir)
                                              for f in files if f.endswith('.xml')]
    def parse(self):
        for xmlFilePath in self.xmlAnnotations:
            logger.info(f"Parsing {os.path.basename(xmlFilePath)} ..")
            try:
                xmlTree = ET.parse(xmlFilePath, parser = self.parser)
                root    = xmlTree.getroot()
            except Exception as err:
                logging.error(f"Could not parse {xmlFilePath}. Reason - {err}")
                traceback.print_exc()
                

下面是解析失败的文件部分的屏幕截图:

enter image description here


Tags: 文件inselfparserparselinexmlet
2条回答

问题是ET.XMLParser实例被重用。ElementTreedoes not support this使用的基础XML库(EXAT):

Due to limitations in the Expat library used by pyexpat, the xmlparser instance returned can only be used to parse a single XML document. Call ParserCreate for each document to provide unique parser instances.

您需要为每个XML文件创建一个新的解析器。移动

self.parser = ET.XMLParser(encoding="utf-8") 

__init__方法到parse方法

解析错误可能也确实会发生。它们只有一个原因:解析器错误。即使这只是一个原因,原因也可能很多。三个共同点:

  • 输入无效(例如,示例中的XML无效)
  • 解析器不兼容(例如,XML输入有效,但(编码)为解析器无法处理的形式或变体)
  • 解析器本身有错误(例如软件错误)

由于您使用的解析器是用软件编写的,并且通常每173行代码中都有一个bug,因此值得一看

但前提是你能看得快。这可能不值得,因为问题更多的是输入。所以,也许值得先研究一下

无论如何,你是幸运的。似乎您想要处理XML,并且存在工具!检查磁盘上文件的有效性,您的程序已经提示您该文件可能因解析错误而无效

同时将其移出该目录并再次启动脚本。它可能不是唯一一个无效的文件,您可能还想尽快找出剩余的文件中有多少会导致脚本出现问题

相关问题 更多 >