Python 3.12实现XML元素内属性按字母排序(不排元素)
解决方案:Python 3.12中XML元素属性按名称忽略大小写排序
核心实现思路
递归遍历XML所有元素,对每个元素的属性按名称小写字母顺序排序(保留原属性名大小写),同时完全保持元素的层级和顺序不变。使用Python标准库的xml.etree.ElementTree解析XML,xml.dom.minidom美化输出格式,确保和示例风格一致。
完整代码
import xml.etree.ElementTree as ET from xml.dom import minidom def sort_element_attributes(element): # 按属性名小写排序,保留原键的大小写 sorted_attrs = sorted(element.attrib.items(), key=lambda x: x[0].lower()) # 重置元素属性为排序后的顺序 element.attrib.clear() element.attrib.update(sorted_attrs) # 递归处理所有子元素 for child in element: sort_element_attributes(child) def sort_xml_attributes(input_path, output_path): # 解析输入XML文件 tree = ET.parse(input_path) root = tree.getroot() # 排序所有元素的属性 sort_element_attributes(root) # 美化XML输出格式(匹配示例的缩进风格) rough_string = ET.tostring(root, 'utf-8') reparsed = minidom.parseString(rough_string) pretty_xml = reparsed.toprettyxml(indent=" ") # 移除自动添加的XML声明(若需保留可删除此段) pretty_xml = '\n'.join( line for line in pretty_xml.split('\n') if line.strip() and not line.startswith('<?xml') ) # 写入输出文件 with open(output_path, 'w', encoding='utf-8') as f: f.write(pretty_xml) # 示例调用 if __name__ == "__main__": sort_xml_attributes("input.xml", "output.xml")
代码说明
- 递归排序属性:
sort_element_attributes函数遍历每个元素,对属性列表按名称小写排序后重新赋值,确保原属性名大小写不变。 - 格式美化:使用
minidom的toprettyxml生成带4空格缩进的格式化XML,和示例的排版风格对齐。 - 兼容性:适配Python 3.7+(3.12完全满足),依赖标准库无需额外安装第三方包。
效果验证
针对你提供的示例输入,运行代码后会生成完全符合期望的输出:
- 所有元素的属性按忽略大小写的字母顺序排列
- 元素的层级、顺序、文本内容完全不变
- 保留原属性名的大小写(如
Name、PowerAttack)
内容的提问来源于stack exchange,提问作者E. Reed
相关产品推荐
相关产品推荐

