如何高效提取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
优化点说明
- 健壮性提升:用XPath定位替代硬编码索引,只要XML中
Point_px的key与坐标array的相邻关系不变,结构其他部分变化不影响提取逻辑 - 效率优化:直接定位目标节点,无需遍历所有XML元素,减少不必要的计算
- 可读性增强:代码逻辑清晰,每一步操作的目的明确,后续维护成本更低
验证结果
运行优化后的代码,针对示例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
相关产品推荐
相关产品推荐

