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

如何解析合并式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:54:52