如何解析合并式XML文件?解决ElementTree报错问题
解决多根元素XML的ElementTree解析问题
错误原因
标准XML文档要求只能有一个根元素,你的文件里存在三个独立的<episodedetails>元素,违反了XML规范,因此ElementTree解析到第二个根元素时会抛出junk after document element错误。
两种解决方案
方案1:修复XML结构(推荐)
给整个文档添加统一的根节点(比如<episodes>),将所有<episodedetails>包裹进去,让文档符合标准XML格式:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <episodes> <episodedetails> <title>Put a Ring On It</title> <showtitle>Tom and Jerry in New York</showtitle> <uniqueid type="tmdb" default="true">3020993</uniqueid> <uniqueid type="tvdb">8009040</uniqueid> <userrating>0</userrating> <top250>0</top250> <season>1</season> <episode>1</episode> <plot>Tom and Jerry storm a department store after dark.</plot> <mpaa>TV-PG</mpaa> <playcount>0</playcount> <lastplayed></lastplayed> <aired>2021-07-01</aired> <studio>HBO Max</studio> <credits>Will Finn</credits> <thumb>https://image.tmdb.org/t/p/original/4xCFkRNWdbVdepDCQkqiXVODCk2.jpg</thumb> </episodedetails> <episodedetails> <title>Come Fly with Me</title> <showtitle>Tom and Jerry in New York</showtitle> <uniqueid type="tmdb" default="true">3052622</uniqueid> <uniqueid type="tvdb">8519098</uniqueid> <userrating>0</userrating> <top250>0</top250> <season>1</season> <episode>2</episode> <plot>Jerry befriends a pigeon.</plot> <mpaa>TV-PG</mpaa> <playcount>0</playcount> <lastplayed></lastplayed> <aired>2021-07-01</aired> <studio>HBO Max</studio> <credits>Will Finn</credits> </episodedetails> <episodedetails> <title>Bubble Gum Crisis</title> <showtitle>Tom and Jerry in New York</showtitle> <uniqueid type="tmdb" default="true">3052623</uniqueid> <uniqueid type="tvdb">8519099</uniqueid> <userrating>0</userrating> <top250>0</top250> <season>1</season> <episode>3</episode> <plot>Tom and Jerry battle for a bag of gumballs.</plot> <mpaa>TV-PG</mpaa> <playcount>0</playcount> <lastplayed></lastplayed> <aired>2021-07-01</aired> <studio>HBO Max</studio> <credits>Will Finn</credits> </episodedetails> </episodes>
之后即可用ElementTree正常解析:
import xml.etree.ElementTree as ET tree = ET.parse('fixed_file.xml') root = tree.getroot() # 遍历所有剧集详情 for episode in root.findall('episodedetails'): title = episode.find('title').text print(title)
方案2:直接解析多根元素(无需修改原文件)
如果不想修改原文件,可使用ET.iterparse逐行解析,捕获每个<episodedetails>元素:
import xml.etree.ElementTree as ET def parse_multi_root_xml(file_path): context = ET.iterparse(file_path, events=('start', 'end')) _, root = next(context) current_episode = None for event, elem in context: if event == 'start' and elem.tag == 'episodedetails': current_episode = elem elif event == 'end' and elem.tag == 'episodedetails': # 处理当前剧集元素 title = current_episode.find('title').text print(title) # 清理已处理元素,避免内存泄漏 root.clear() parse_multi_root_xml('your_file.xml')
该方法通过监听元素的start和end事件,逐个处理每个剧集节点,同时清理已处理内容,适合大文件场景。
内容的提问来源于stack exchange,提问作者bob_the_bob
相关产品推荐
相关产品推荐

