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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:45:52