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

遍历METS XML文件生成字典时属性值重复问题求助

问题分析与修正:METS XML解析时字典值被覆盖

问题根源

你的代码存在三个关键逻辑错误:

  1. 缩进错误:处理XML文件的核心代码(解析、提取数据)没有缩进在if filename.endswith(".xml"):的代码块内,导致只有最后一个XML文件的路径被持续处理,前面的文件完全没被解析。
  2. 无效循环:for file in fullpath:是多余且错误的——fullpath是单个文件的路径字符串,遍历它会逐个字符循环,重复解析同一个文件多次。
  3. 全局覆盖:每次处理完一个文件后,你遍历了所有已收集的图片路径,把它们的字典值都替换成当前文件的title和identifier,最终所有键都会被最后一个文件的信息覆盖。

修正后的代码

import xml.etree.ElementTree as ET
import os

path = r'C:\programming1\Schelling\test'
metDict = {}

for filename in os.listdir(path):
    if filename.endswith(".xml"):
        fullpath = os.path.join(path, filename)
        # 解析当前XML文件
        tree = ET.parse(fullpath)
        root = tree.getroot()
        # 提取当前文件的title和identifier
        metstitle = root[1].text
        metsIdentifier = root[0].attrib["type"]
        # 遍历当前文件内的所有file节点,直接写入字典
        for file_node in root[2]:
            href = file_node.attrib["href"]
            metDict[href] = [metstitle, metsIdentifier]

# 打印结果
print(metDict)

修正说明

  1. 把所有文件处理逻辑缩进在if filename.endswith(".xml"):内部,确保每个XML文件都被依次解析。
  2. 移除了无效的for file in fullpath:循环,直接解析单个文件路径。
  3. 不再维护全局的图片列表,而是解析一个文件时,就把该文件内的所有href直接关联到当前文件的title和identifier,避免后续覆盖之前的键值对。

运行修正后的代码,会得到你期望的结果:

{
    '161_Bl_1r.jpg': ['1. München, 26.03.1841; Bl. 1r-3v', '1'],
    '161_Bl_1v.jpg': ['1. München, 26.03.1841; Bl. 1r-3v', '1'],
    '161_Bl_2r.jpg': ['1. München, 26.03.1841; Bl. 1r-3v', '1'],
    '162_Bl_1r.jpg': ['2. München, 26.03.1841; Bl. 1r-3v', '2'],
    '162_Bl_1v.jpg': ['2. München, 26.03.1841; Bl. 1r-3v', '2'],
    '162_Bl_2r.jpg': ['2. München, 26.03.1841; Bl. 1r-3v', '2']
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:20:27