如何从含多个XML文档的文件中提取所有inv-title标签内容?
提取多XML文档文件中所有
<inv-title>内容的解决方案 你的问题根源在于:这个文件是两个独立的XML文档直接拼接而成,并非标准的单根XML结构,普通XML解析器只会解析到第一个文档结束就停止,因此只能获取第一个<inv-title>的值。下面提供两种可行的解决方法:
方法一:用lxml的iterparse逐元素解析
这种方法无需完整加载文档,会逐个处理XML元素,能覆盖所有独立文档中的目标标签:
from lxml import etree # 注意:原代码里的文件后缀是.json,应为笔误,改成实际的XML文件名 MiFile = 'C:\\Users\\TestFilePat.xml' # 逐元素解析,处理每个<inv-title>标签 for event, elem in etree.iterparse(MiFile, events=('end',), recover=True): if elem.tag == 'inv-title': # 提取并清理文本内容(去掉前后空格) print(elem.text.strip()) # 清理已处理的节点,节省内存 elem.clear()
方法二:拆分独立文档后分别解析
修复你之前的拆分逻辑,解决最后一个文档未处理的问题,同时优化判断条件:
import xml.etree.ElementTree as ET MiFile = 'C:\\Users\\TestFilePat.xml' accumulate_xml = [] with open(MiFile, 'r', encoding='utf-8') as file1: for line in file1: stripped_line = line.strip() # 遇到新的XML声明或DOCTYPE时,处理上一个积累的文档 if stripped_line.startswith(('<?xml', '<!DOCTYPE')): if accumulate_xml: xml_str = ''.join(accumulate_xml) try: tree = ET.fromstring(xml_str) inv_title = tree.find('.//inv-title').text.strip() print(inv_title) except Exception as e: print(f"解析出错: {e}") accumulate_xml = [] accumulate_xml.append(stripped_line) elif stripped_line: # 跳过空行,积累有效XML内容 accumulate_xml.append(stripped_line) # 处理最后一个未被解析的文档 if accumulate_xml: xml_str = ''.join(accumulate_xml) try: tree = ET.fromstring(xml_str) inv_title = tree.find('.//inv-title').text.strip() print(inv_title) except Exception as e: print(f"解析最后一个文档出错: {e}")
额外注意事项
- 原代码中
MiFile的后缀写为.json,属于笔误,需改为实际的XML文件后缀 - 如果XML文件存在编码问题,打开文件时需指定对应编码(如
encoding='utf-8')
内容的提问来源于stack exchange,提问作者Juliana Rivera
相关产品推荐
相关产品推荐

