Python按父节点解析XML所有子及嵌套子节点元素方法
电路XML解析实现方案
核心思路是先定位所有顶层器件父节点,再针对每个父节点单独递归遍历其下所有层级的嵌套节点,按父节点分类归集节点信息,避免跨节点数据混淆。
实现代码
直接使用标准库xml.etree.ElementTree即可完成,无需额外依赖:
import xml.etree.ElementTree as ET from collections import defaultdict def parse_circuit_xml(xml_file_path): tree = ET.parse(xml_file_path) root = tree.getroot() parse_result = {} # 遍历根节点下的直接子节点,筛选顶层器件父节点 for top_node in root: # 跳过非器件类节点,比如Profile配置节点 if top_node.tag == "Profile": continue top_tag = top_node.tag parse_result[top_tag] = defaultdict(list) # 递归遍历当前顶层节点下所有后代(覆盖任意深度的嵌套孙节点) for child_node in top_node.iter(): # 跳过顶层父节点自身,仅收集下属节点 if child_node is top_node: continue # 归集节点tag和属性 parse_result[top_tag][child_node.tag].append(dict(child_node.attrib)) # 转为普通字典输出 return {tag: dict(node_map) for tag, node_map in parse_result.items()} # 功能校验示例 if __name__ == "__main__": circuit_data = parse_circuit_xml("your_circuit_file.xml") # 接地校验函数:检查指定父节点下目标tag的节点是否存在Net/Power为GND的项 def is_node_connected_gnd(parent_data, target_tag): target_nodes = parent_data.get(target_tag, []) for node_attr in target_nodes: if node_attr.get("Net") == "GND" or node_attr.get("Power") == "GND": return True, node_attr return False, None # 示例:校验U2501下PR4426是否接地 gnd_status, node_attr = is_node_connected_gnd(circuit_data["U2501"], "PR4426") print(f"PR4426接地状态:{gnd_status},节点属性:{node_attr}")
说明
- 输出结构和预期格式完全对齐,同tag的多个节点会自动归集到对应列表下,不会遗漏重复器件
- 用单节点
iter()遍历的方式天然限定了节点归属范围,不需要手动维护全量父节点映射表,避免跨顶层父节点的数据混错 - 如果只需要处理指定的顶层父节点,直接在遍历顶层节点时加过滤判断即可,例如
if top_tag not in ["U7418", "U2501"]: continue - 校验逻辑可以直接基于解析后的结构化数据实现,无需重复读取解析XML文件
内容的提问来源于stack exchange,提问作者lulu313kobe
相关产品推荐
相关产品推荐

