如何用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
相关产品推荐
相关产品推荐

