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

如何用Python xmltree按含浮点值的START属性排序POSITION_MARK子元素

使用Python的xml.etree按浮点型START属性排序Rekordbox XML中的POSITION_MARK标签

需求说明

需要处理先锋Rekordbox DJ软件导出的XML文件,将每个<TRACK>标签下的<POSITION_MARK>子标签按其Start属性的浮点值从小到大升序排列。此前参考的排序方案仅支持整数属性,无法适配浮点值场景。

解决方案

用Python标准库xml.etree.ElementTree就能实现,核心是把Start属性转成浮点型作为排序依据,步骤如下:

  • 解析目标XML文件
  • 遍历所有<TRACK>节点
  • 提取每个<TRACK>下的<POSITION_MARK>节点,按Start属性的浮点值排序
  • 移除原<TRACK>下的<POSITION_MARK>节点,再按排序后的顺序重新添加
  • 将修改后的XML写入文件

完整代码

import xml.etree.ElementTree as ET

# 解析XML文件(替换为你的文件路径)
tree = ET.parse('rekordbox_playlist.xml')
root = tree.getroot()

# 遍历所有TRACK节点
for track in root.findall('.//TRACK'):
    # 提取当前TRACK下的所有POSITION_MARK节点
    position_marks = track.findall('POSITION_MARK')
    
    # 按Start属性的浮点值升序排序
    sorted_marks = sorted(position_marks, key=lambda x: float(x.get('Start', 0.0)))
    
    # 移除原有的POSITION_MARK节点
    for mark in position_marks:
        track.remove(mark)
    
    # 将排序后的节点重新添加到TRACK下
    for mark in sorted_marks:
        track.append(mark)

# 保存修改后的XML(替换为输出路径)
tree.write('sorted_rekordbox_playlist.xml', encoding='utf-8', xml_declaration=True)

关键说明

  • 排序逻辑里,通过lambda x: float(x.get('Start', 0.0))把Start属性的字符串值转成浮点型,以此作为排序依据,完美适配浮点值排序需求
  • findall('.//TRACK')会递归查找所有层级的<TRACK>节点,不管它在XML结构中的位置
  • 先移除原有节点再添加排序后的节点,确保TRACK下的子节点顺序完全符合要求

注意事项

示例XML里有一处笔误:第二个<TRACK>下的第一个标签是<POSITION_MARM>(拼写错误),代码会自动忽略这个节点(因为findall('POSITION_MARK')匹配不到),如果要处理这类拼写错误,可以调整findall的匹配规则或提前修正XML。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:57:15