python:xml.etree.ElementTree 读 Freeplane.mm文件,生成测试案例.csv文件

文章介绍了如何使用Python脚本fpmm_etree_csv.py,利用XML.etree.ElementTree解析Freeplane.mm文件,提取思维导图中的信息,生成包含应用系统名、测试功能描述等字段的测试案例CSV文件。

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。

强大的节点功能,不仅仅节点的种类很多,而且对于节点的编辑样式也丰富很多,比如数学公式、表格、HTML 的支持等;

思维导图最基本的功能就是新增节点了,Freeplane 通过 Enter 和 Tab 分别新建同级节点和下一级节点。
除了使用上述的基本节点功能外,Freeplane 还提供了 总结节点 的功能,选择一些节点,通过 编辑 -> 新增节点 -> 新增总节点 来增加总结节点。

python:xml.etree.ElementTree 读 Freeplane.mm文件,生成测试案例.csv文件。

编写 fpmm_etree_csv.py  如下.

#-*- coding: UTF-8 -*-
""" 读 Freeplane.mm文件,使用 xml.etree 生成测试案例.csv文件"""
import os
import sys
import codecs
import xml.etree.ElementTree as ET

# 全局唯一标识 unique_id 缩写: uid
uid = 1

def walk(root_node, level, result_list):
    """ 遍历所有的节点 """
    global uid
    if root_node.tag == 'node':
        tmp_list = [uid, level, root_node.tag, root_node.attrib]
        result_list.append(tmp_list)
        uid += 1

    # 遍历每个子节点
    children_node = root_node.getchildren()
    if len(children_node) == 0:
        return
    for child in children_node:
        walk(child, level+1, result_list)
    return

def getXmlData(file_name):
    level = 0 # 节点的深度
    result_list = []
    root = ET.parse(file_name).getroot()
    walk(root, level, result_list)
    return result_list

# main()
if len(sys.argv) ==2:
    f1 = sys.argv[1]
else:
    print('usage: python fpmm_etree_csv.py file1.mm')
    sys.exit(1)

if not os.path.exists(f1):
    print(f"{f1} is not exists.")
    sys.exit(2)

fn,ext = os.path.splitext(f1)
if ext.lower() != '.mm':
    print('ext is not .mm')
    sys.exit(2)

fr = codecs.open(f1, mode='r', encoding="utf-8")
# 读取第一行:
line1 = fr.readline()
if not line1.startswith('<map version='):
    print('it is not freemind map file.')
    sys.exit(3)
fr.close()

# 读取文件 file_name
R = getXmlData(f1)
f2 = fn +'.csv'
fp = codecs.open(f2, 'w', encoding='cp936')
fp.write('应用系统名,测试功能描述,正反向,执行步骤,预期结果\n')

# zd?:字段?的拼音缩写
# zd1: 应用系统名的英文或拼音缩写
# zd2: 模块名
# zd3: 正向 或 反向
# zd4: 功能名
# zd5: 执行步骤
# zd6: 预期结果
for node in R:
    if node[1] ==1:
        zd1 = node[3]['TEXT']
    elif node[1] ==2:
        zd2 = node[3]['TEXT']
    elif node[1] ==3:
        zd3 = node[3]['TEXT']
    elif node[1] ==4:
        zd4 = node[3]['TEXT']
    elif node[1] ==5:
        txt = node[3]['TEXT']
        if txt.startswith('步骤'):
            zd5 = txt[3:]
        elif txt.startswith('预期结果'):
            zd6 = txt[5:]
            csgnms = '-'.join((zd2,zd4)) # 测试功能描述
            line = f'"{zd1}","{csgnms}","{zd3}","{zd5}","{zd6}"\n'
            fp.write(line)
        else:
            zd5 =''
            zd6 =''
fp.close()
print(f'gen: {f2}')

请注意这一关键语句: children_node = root_node.getchildren()

运行 python fpmm_etree_csv.py your_test.mm

生成 your_test.csv

应用系统名,测试功能描述,正反向,执行步骤,预期结果
"root节点","模块1-功能11","正向","1.步骤","1.结果"
"root节点","模块1-功能12","正向","2.步骤","2.结果"
"root节点","模块1-功能11","反向","3.步骤","3.结果"
"root节点","模块1-功能12","反向","4.步骤","4.结果"
"root节点","模块2-功能21","正向","5.步骤","5.结果"
"root节点","模块2-功能22","正向","6.步骤","6.结果"
"root节点","模块2-功能21","反向","7.步骤","7.结果"
"root节点","模块2-功能22","反向","8.步骤","8.结果"

参考:python 使用xml.etree.ElementTree遍历xml所有节点

```markdown # 修复:`market.csv` 转 XML生成文件的问题 你反馈的问题: > ✅ 第三步:将 market.csv 转换为 XML(使用 ElementTree) > 我们将把 market.csv 转成结构化的 XML 文件。**没有生成** 说明代码已运行但 **XML 文件未出现在指定路径**。下面我们一步步排查并解决这个问题。 --- ## 🔍 可能原因分析 | 原因 | 是否常见 | 检查方式 | |------|---------|----------| | 1. 代码中存在错误或异常,导致入失败 | ⭐ 高频 | 查看是否报错 | | 2. 输出路径无权限或路径不存在 | ⭐ 高频 | 检查文件夹是否存在 | | 3. 程序未实际运行(静默执行中断) | 中频 | 添加打印确认 | | 4. 入了其他位置(相对路径误解) | 中频 | 搜索整个电脑找 `market_data.xml` | 我们逐项排查! --- ## ✅ 步骤一:添加完整容错与调试信息 请将原来的转换代码替换为以下 **带错误提示和验证的版本**: ```python import pandas as pd import xml.etree.ElementTree as ET import os # 设置路径(确保与你的文件一致) info_csv_path = r"C:\Users\wws\Desktop\DTS207\info.csv" market_csv_path = r"C:\Users\wws\Desktop\DTS207\market.csv" output_xml = r"C:\Users\wws\Desktop\DTS207\market_data.xml" # 检查输入文件是否存在 if not os.path.exists(market_csv_path): print(f"❌ 错误:找不到 market.csv 文件!路径是:{market_csv_path}") else: print(f"✅ 找到 market.csv") # 取数据 try: market_data_df = pd.read_csv(market_csv_path) print(f"✅ 成功加载 {len(market_data_df)} 行数据") except Exception as e: print(f"❌ CSV 失败:{e}") raise # 构建 XML 树 try: root = ET.Element('MarketData') for index, row in market_data_df.iterrows(): record = ET.SubElement(root, 'Record') # 安全处理字段(防止 NaN 或缺失) def safe_str(val): return str(val) if pd.notna(val) else "" ET.SubElement(record, 'Timestamp').text = safe_str(row['timestamp']) ET.SubElement(record, 'Symbol').text = safe_str(row['symbol']) ET.SubElement(record, 'AskPrice').text = safe_str(row['a']) ET.SubElement(record, 'AskQuantity').text = safe_str(row['aq']) ET.SubElement(record, 'BidPrice').text = safe_str(row['b']) ET.SubElement(record, 'BidQuantity').text = safe_str(row['bq']) # 尝试入前检查输出目录是否可 output_dir = os.path.dirname(output_xml) if not os.path.exists(output_dir): print(f"❌ 目标文件夹不存在:{output_dir}") elif not os.access(output_dir, os.W_OK): print(f"❌ 目标文件夹不可,请检查权限:{output_dir}") else: try: tree = ET.ElementTree(root) tree.write(output_xml, encoding='utf-8', xml_declaration=True) print(f"✅ 成功生成 XML 文件!保存在:\n {output_xml}") # 额外验证:检查文件是否真实存在且非空 if os.path.exists(output_xml) and os.path.getsize(output_xml) > 0: print("🟢 文件已创建且大小正常") else: print("⚠️ 文件生成或为空") except Exception as e: print(f"❌ XML 文件失败:{e}") except Exception as e: print(f"❌ 构建 XML 过程出错:{e}") ``` --- ## ✅ 步骤二:手动检查关键点 ### 1. 确认桌面有这个文件夹: ``` C:\Users\wws\Desktop\DTS207\ ``` 👉 如果没有,请新建一个叫 `DTS207` 的文件夹在桌面上。 ### 2. 确保这两个文件确实存在: - `C:\Users\wws\Desktop\DTS207\market.csv` - `C:\Users\wws\Desktop\DTS207\info.csv` 你可以打开资源管理器导航到该路径查看。 ### 3. 不要使用中文命名或特殊字符 确保文件名是: - ❌ 不要叫:`市场数据.csv` - ✅ 必须叫:`market.csv` --- ## ✅ 步骤三:替代方案 —— 先保存到当前工作目录 如果还是失败,可以先让程序保存到 Jupyter 当前目录试试: ```python # 修改输出路径为当前目录 output_xml = "market_data.xml" # 其余代码不变…… tree = ET.ElementTree(root) tree.write(output_xml, encoding='utf-8', xml_declaration=True) print(f"✅ XML 已保存在当前工作目录:{os.getcwd()}/market_data.xml") ``` 然后你在 Jupyter 主界面刷新一下,就能看到 `market_data.xml` 文件出现了! --- ## 📘 核心知识点详解(不超过三项) ### 1. 文件路径管理 Python 中需用原始字符串 `r""` 避免 `\` 被转义,如 `r"C:\path"`,否则路径解析会出错。 ### 2. ElementTree 入机制 必须调用 `ElementTree(root).write()` 才能真正入磁盘,仅构建树不会自动保存。 ### 3. 异常处理(try-except) 通过捕获异常可定位具体错误,如权限不足、路径无效、数据缺失等常见问题。 --- ## ✅ 最终建议 1. 使用上面提供的 **完整带报错检测的代码** 2. 确保目标文件夹存在 3. 运行后看控制台输出是哪个环节失败 4. 若仍不行,请复制完整报错信息发给我,我会帮你精准定位 你现在离成功只差一步!坚持住 💪 > —— 由 优快云 和外部合作伙伴合作研发的 AI 作业模型机器人 提供支持 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值