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

如何高效提取XML中Point_px标签后的分割点数据?

更高效的XML分割点提取方案

问题说明

手头有一个存储分割点的plist格式XML文件,分割点数据位于文本为Point_px的<key>标签的下一个兄弟标签(<array>)中,而非<key>内部。现有Python代码可实现提取,但依赖硬编码索引且遍历逻辑不够直观,需要更高效健壮的实现方式。

现有代码的不足

  • 依赖硬编码索引self.xml[0][1][0][5],XML结构稍有变化就会失效,可读性极差
  • 通过遍历所有元素并记录索引的方式定位目标节点,逻辑冗余且效率偏低

优化实现方案

利用xml.etree.ElementTree的XPath查询能力,直接定位目标节点,避免无效遍历和硬编码依赖:

import xml.etree.ElementTree as ET

class XML_files:
    # 其他代码保留
    def get_points(self):
        # XPath定位:找到所有文本为Point_px的key节点,取其紧随的第一个兄弟节点(即存储坐标的array)
        point_containers = self.xml.findall(".//key[text()='Point_px']/following-sibling::*[1]")
        segments = []
        
        for container in point_containers:
            # 解析当前array下的所有坐标字符串
            current_segment = []
            for coord_str_node in container.findall("string"):
                # 清理坐标字符串并转换为整数
                raw_coord = coord_str_node.text.strip("()")
                x, y = map(lambda val: int(float(val.strip())), raw_coord.split(","))
                current_segment.append([x, y])
            segments.append(current_segment)
        
        return segments

优化点说明

  1. 健壮性提升:用XPath定位替代硬编码索引,只要XML中Point_px的key与坐标array的相邻关系不变,结构其他部分变化不影响提取逻辑
  2. 效率优化:直接定位目标节点,无需遍历所有XML元素,减少不必要的计算
  3. 可读性增强:代码逻辑清晰,每一步操作的目的明确,后续维护成本更低

验证结果

运行优化后的代码,针对示例XML可输出符合预期的格式:

[[[468, 2109]],
[[932, 2154],
[935, 2151],
[940, 2149],
[945, 2149],
[949, 2151],
[952, 2154],
[954, 2158],
[954, 2162],
[953, 2167],
[951, 2170],
[947, 2173],
[943, 2173],
[938, 2173],
[934, 2171],
[932, 2167],
[931, 2164],
[931, 2159]],
[[1347, 1894]]]

内容的提问来源于stack exchange,提问作者Alican Kartal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:30:51