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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:20:59