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

如何在Python中将XML文件读取为字典?已尝试方法报错求助

问题:无法将Garmin TCX格式XML转换为Python字典

问题背景

我参考了Stack Overflow上的几个回答,但都无法帮我将Garmin的TCX格式XML文件读取为简洁易用的Python字典。

尝试的代码及错误

第一个代码实现

from collections import defaultdict

def etree_to_dict(t):
    d = {t.tag: {} if t.attrib else None}
    children = list(t)
    if children:
        dd = defaultdict(list)
        for dc in map(etree_to_dict, children):
            for k, v in dc.items():
                dd[k].append(v)
        d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.items()}}
    if t.attrib:
        d[t.tag].update(('@' + k, v) for k, v in t.attrib.items())
    if t.text:
        text = t.text.strip()
        if children or t.attrib:
            if text:
              d[t.tag]['#text'] = text
        else:
            d[t.tag] = text
    return d

with open('run.tcx', 'r') as f:
    data = f.read()

from pprint import pprint
pprint(etree_to_dict(data))

运行后触发错误:

Traceback (most recent call last):
  File "tester.py", line 33, in <module>
    pprint(etree_to_dict(data))
  File "tester.py", line 8, in etree_to_dict
    d = {t.tag: {} if t.attrib else None}
AttributeError: 'str' object has no attribute 'tag'

第二个代码实现

我还尝试了另一个转换函数:

import xml.etree.ElementTree as ET
from copy import copy

def dictify(r,root=True):
    if root:
        return {r.tag : dictify(r, False)}
    d=copy(r.attrib)
    if r.text:
        d["_text"]=r.text
    for x in r.findall("./*"):
        if x.tag not in d:
            d[x.tag]=[]
        d[x.tag].append(dictify(x,False))
    return d

同样出现了上述AttributeError: 'str' object has no attribute 'tag'错误。

待处理的TCX文件开头内容

<?xml version="1.0" encoding="UTF-8"?><TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd"><Activities><Activity Sport="Running"><Id>2022-08-20T05:58:57Z</Id><Lap StartTime="2022-08-20T05:58:57Z"><Calories>1060.0</Calories><DistanceMeters>14468.162</DistanceMeters><TotalTimeSeconds>6259.0</TotalTimeSeconds><Track><Trackpoint>...

请问我是不是哪里操作有误?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:01:07