You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python解析带有多个子节点的XML文件

嘿,我来帮你搞定这个Python解析XML的问题!你给出的这种带有多层嵌套子节点的XML结构,用Python很容易处理,下面给你两种实用的方案,都是日常开发里常用的:

方案一:用Python内置的xml.etree.ElementTree

这个是Python自带的库,不需要额外安装,足以应对大多数常规的XML解析需求,非常适合你的场景。

1. 先解析XML内容

你可以选择从本地文件读取,或者直接解析字符串(比如你给出的XML片段,适合快速测试):

从文件读取XML

import xml.etree.ElementTree as ET

# 加载本地XML文件
tree = ET.parse('your_ocr_errors.xml')
root = tree.getroot()

从字符串解析XML(测试用)

先把你的XML片段补全成完整结构(方便测试),然后解析:

import xml.etree.ElementTree as ET

# 完整的XML内容(补全了你没写完的LETTER部分)
xml_content = '''<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <OCR_ERRORS_TABLE>
    <FIGURE>
      <ELEMENT>
        <REF>0</REF>
        <MISREAD_CHARS>O</MISREAD_CHARS>
      </ELEMENT>
      <ELEMENT>
        <REF>1</REF>
        <MISREAD_CHARS>rilLM</MISREAD_CHARS>
      </ELEMENT>
      <ELEMENT>
        <REF>6</REF>
        <MISREAD_CHARS>G</MISREAD_CHARS>
      </ELEMENT>
    </FIGURE>
    <LETTER>
      <ELEMENT>
        <REF>0</REF>
        <MISREAD_CHARS>X</MISREAD_CHARS>
      </ELEMENT>
      <ELEMENT>
        <REF>2</REF>
        <MISREAD_CHARS>yz</MISREAD_CHARS>
      </ELEMENT>
    </LETTER>
  </OCR_ERRORS_TABLE>
</ROOT>'''

# 解析字符串
root = ET.fromstring(xml_content)

2. 提取你需要的数据

根据XML的层级结构,我们可以精准定位到FIGURE、LETTER下的ELEMENT节点,提取REF和MISREAD_CHARS的值:

提取FIGURE下的所有错误数据

# 先定位到OCR_ERRORS_TABLE节点
ocr_table = root.find('OCR_ERRORS_TABLE')

# 获取FIGURE下的所有ELEMENT节点
figure_elements = ocr_table.find('FIGURE').findall('ELEMENT')

# 遍历输出每个ELEMENT的内容
for elem in figure_elements:
    ref_num = elem.find('REF').text
    misread = elem.find('MISREAD_CHARS').text
    print(f"图中错误 - 编号: {ref_num}, 误读字符: {misread}")

提取LETTER下的所有错误数据

# 获取LETTER下的所有ELEMENT节点
letter_elements = ocr_table.find('LETTER').findall('ELEMENT')

for elem in letter_elements:
    ref_num = elem.find('REF').text
    misread = elem.find('MISREAD_CHARS').text
    print(f"文字错误 - 编号: {ref_num}, 误读字符: {misread}")

一次性获取所有ELEMENT数据(不管父节点)

如果想偷懒,直接把所有ELEMENT节点的数据都取出来,可以用iter()方法:

for elem in root.iter('ELEMENT'):
    ref_num = elem.find('REF').text
    misread = elem.find('MISREAD_CHARS').text
    # 获取父节点的标签(是FIGURE还是LETTER)
    parent_tag = elem.getparent().tag
    print(f"{parent_tag}错误 - 编号: {ref_num}, 误读字符: {misread}")

3. 处理可能的空值情况

如果XML里某些节点可能为空或者不存在,最好加个判断,避免程序报错:

for elem in root.iter('ELEMENT'):
    # 处理REF节点
    ref_elem = elem.find('REF')
    ref_num = ref_elem.text if (ref_elem and ref_elem.text) else '无编号'
    
    # 处理MISREAD_CHARS节点
    misread_elem = elem.find('MISREAD_CHARS')
    misread = misread_elem.text if (misread_elem and misread_elem.text) else '无内容'
    
    parent_tag = elem.getparent().tag
    print(f"{parent_tag}错误 - 编号: {ref_num}, 误读字符: {misread}")
方案二:用lxml库(更强大的第三方工具)

如果你需要更复杂的XML操作(比如XPath查询、命名空间支持、更快的解析速度),可以用lxml这个第三方库。首先得安装它:

pip install lxml

然后用lxml解析的示例:

from lxml import etree

# 解析XML字符串
root = etree.fromstring(xml_content)

# 用XPath直接定位所有ELEMENT节点
all_elements = root.xpath('//ELEMENT')

for elem in all_elements:
    # 用XPath提取文本,处理空值
    ref_num = elem.xpath('./REF/text()')[0] if elem.xpath('./REF/text()') else '无编号'
    misread = elem.xpath('./MISREAD_CHARS/text()')[0] if elem.xpath('./MISREAD_CHARS/text()') else '无内容'
    parent_tag = elem.getparent().tag
    print(f"{parent_tag}错误 - 编号: {ref_num}, 误读字符: {misread}")

用XPath可以非常灵活地定位节点,比如想只取FIGURE下的ELEMENT,直接写root.xpath('//FIGURE/ELEMENT')就行了,比内置库的写法更简洁。


内容的提问来源于stack exchange,提问作者Nathan Cheval

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:25:03