如何用Python按id标签内容对XML中的user节点排序?
使用xml.etree.ElementTree实现XML节点按id数值排序
要实现将<user>节点按<id>的数值排序,你可以按照以下步骤操作:
核心步骤
- 解析XML获取根节点
- 提取所有
<user>节点并根据<id>的整数值排序 - 清空根节点原有
<user>节点,再将排序后的节点重新添加 - 格式化输出或保存结果
完整代码实现
import xml.etree.ElementTree as ET # 示例XML输入(如果是本地文件,改用ET.parse('your_file.xml').getroot()) xml_input = '''<root> <user> <id>2</id> <name>xyz</name> </user> <user> <id>1</id> <name>abc</name> </user> </root>''' # 解析XML字符串 root = ET.fromstring(xml_input) # 获取所有user节点 user_nodes = root.findall('user') # 按id的整数值排序:注意要把id文本转为整数,避免字符串排序错误 sorted_users = sorted(user_nodes, key=lambda node: int(node.find('id').text)) # 移除根节点中原有user节点 for node in user_nodes: root.remove(node) # 将排序后的节点添加回根节点 for node in sorted_users: root.append(node) # 自定义缩进函数,让输出XML更美观(ElementTree原生无缩进) def add_indent(elem, level=0): indent_str = "\n" + level * " " if len(elem): if not elem.text or not elem.text.strip(): elem.text = indent_str + " " if not elem.tail or not elem.tail.strip(): elem.tail = indent_str for child in elem: add_indent(child, level + 1) if not child.tail or not child.tail.strip(): child.tail = indent_str else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = indent_str # 添加缩进并输出结果 add_indent(root) print(ET.tostring(root, encoding='unicode'))
关键说明
- 排序依据必须转整数:如果直接用
<id>的文本字符串排序,会出现"10"排在"2"前面的错误,所以一定要用int()转换后再排序 - 缩进处理:xml.etree.ElementTree默认输出的XML没有缩进,上述
add_indent函数可以手动添加缩进,让结果更易读 - 文件处理:如果是处理本地XML文件,替换解析和保存逻辑:
# 读取文件 tree = ET.parse('input.xml') root = tree.getroot() # ...排序操作... # 保存排序后的文件 add_indent(root) tree.write('sorted_output.xml', encoding='utf-8', xml_declaration=True)
内容的提问来源于stack exchange,提问作者Billy Grant
相关产品推荐
相关产品推荐

