无法解析 Python 中的 XML 个文件 - xml.etree.ElementTree.ParseError
Cannot parse XML files in Python - xml.etree.ElementTree.ParseError
我正在尝试使用 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()
下面是文件解析失败部分的截图:
解析错误可能而且确实会发生。他们只有一个原因:解析器错误。即使这只是一个原因,原因也可能很多。三个常见的:
- 输入无效(例如,您的示例中 XML 无效)
- 解析器不兼容(例如,XML 输入有效,但(编码)为解析器无法处理的形式或变体)
- 解析器本身有错误(例如软件错误)
由于您使用的解析器是用软件编写的,并且通常每 ~173 行代码中都有一个错误,因此值得快速查看一下。
但前提是你要看得快。这可能不值得,因为更多时候问题出在输入上。所以也许值得先研究一下。
无论如何你是幸运的。似乎您想处理 XML 并且存在工具!检查磁盘上文件的有效性,您的程序已经提示您它可能因解析错误而无效。
也将其移出该目录并重新启动您的脚本。它可能不是唯一无效的文件,您可能还想尽快找出有多少剩余文件导致您的脚本出现问题。
问题是 ET.XMLParser
实例被重用了。 ElementTree does not support this:
使用的底层 XML 库 (Expat)
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
方法。
我正在尝试使用 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()
下面是文件解析失败部分的截图:
解析错误可能而且确实会发生。他们只有一个原因:解析器错误。即使这只是一个原因,原因也可能很多。三个常见的:
- 输入无效(例如,您的示例中 XML 无效)
- 解析器不兼容(例如,XML 输入有效,但(编码)为解析器无法处理的形式或变体)
- 解析器本身有错误(例如软件错误)
由于您使用的解析器是用软件编写的,并且通常每 ~173 行代码中都有一个错误,因此值得快速查看一下。
但前提是你要看得快。这可能不值得,因为更多时候问题出在输入上。所以也许值得先研究一下。
无论如何你是幸运的。似乎您想处理 XML 并且存在工具!检查磁盘上文件的有效性,您的程序已经提示您它可能因解析错误而无效。
也将其移出该目录并重新启动您的脚本。它可能不是唯一无效的文件,您可能还想尽快找出有多少剩余文件导致您的脚本出现问题。
问题是 ET.XMLParser
实例被重用了。 ElementTree does not support this:
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
方法。