如何用Python读取含重复Keyword标签的XML并保留层级转字典
解决方案
要保留XML中<Keyword>标签的层级关系并转换为嵌套字典,需要递归遍历DOM树,而非使用getElementsByTagName获取所有标签的扁平列表。以下是修改后的代码:
import xml.dom.minidom as xmldom def parse_keyword(element): """递归解析单个Keyword元素,返回对应的嵌套字典""" keyword_name = element.getAttribute('name') # 筛选当前元素下的子Keyword标签(忽略文本节点等非元素节点) child_keywords = [ child for child in element.childNodes if child.nodeType == child.ELEMENT_NODE and child.tagName == 'Keyword' ] if child_keywords: # 有子Keyword,递归构建嵌套字典 children_dict = {} for child in child_keywords: children_dict.update(parse_keyword(child)) return {keyword_name: children_dict} else: # 没有子Keyword,提取Value/value属性值 keyword_value = element.getAttribute('Value') or element.getAttribute('value') return {keyword_name: keyword_value} if __name__ == '__main__': xml_file = xmldom.parse('xmlfile.xml') eles = xml_file.documentElement # 获取基础信息(保留原代码逻辑) defect = eles.getElementsByTagName('DefectID')[0].firstChild.data escalation = eles.getElementsByTagName('EscalationID')[0].firstChild.data title = eles.getElementsByTagName('Title')[0].firstChild.data # 解析KeywordList下的所有顶层Keyword keyword_list = eles.getElementsByTagName('KeywordList')[0] top_keywords = keyword_list.getElementsByTagName('Keyword') # 构建最终字典 result = {} for kw in top_keywords: result.update(parse_keyword(kw)) print(result)
代码说明
- 递归遍历:
parse_keyword函数检查当前<Keyword>是否包含子<Keyword>标签,若有则递归处理每个子标签,否则提取其Value(或小写value)属性值。 - 层级保留:从
KeywordList开始遍历顶层<Keyword>,再逐层递归子标签,完整保留XML中的父子结构。 - 属性兼容:同时处理大写
Value和小写value属性,避免因大小写差异导致取值失败。
输出结果(修正语法后的有效结构)
{ 'a1': { 'a1001': { 'a1001001': 'Keyword1001001', 'a1001002': 'Keyword1001002' }, 'a1002': 'Keyword1002', 'a1003': 'Keyword1003', 'a1004': 'Keyword1004' }, 'a2': 'Keyword2', 'a3': 'Keyword3', 'a4': 'Keyword4' }
注:你提供的期望输出存在语法错误(同一键对应多个字典值),上述输出为符合Python语法规范的正确层级结构。
内容的提问来源于stack exchange,提问作者Neruru
相关产品推荐
相关产品推荐

