思路
思路直接使用 百码山庄 的文章 【原创】XMind免费到Excel的全过程。该文使用 nodejs / php 实现本功能,本文使用 python 实现。
- 转换 xmind 文件为 freemind
.mm
后缀文件。 - freemind 文件实为 xml 格式,通过解析 xml 文件,按格式导出为 excel。
freemind 格式分析
freemind 文件格式分析,xml 源码及 xmind mindmap 如下所示。
1 |
|
- 根节点
1 | <map version="0.8.1">` |
- mindmap 节点
1 | <node TEXT="项目计划" MODIFIED="1492867311576" ID="0hai9mmspjp2s786pcir50olb1" CREATED="1492867311576"> |
- 联系节点,即 xmind 中的箭头,ctrl + l
1 | <arrowlink ID="221s6rn1ft46fc6207057chd1k" STARTINCLINATION="43;180" STARTARROW="None" ENDARROW="Default" DESTINATION="61q31b1bilu0mpim374q7hn048"/> |
- 备注节点,node 节点的子节点。
1 | <node TEXT="项目经理" MODIFIED="1492867311576" ID="734nep595s7klig55tfn46h3tr" CREATED="1492867311576"> |
- 概要节点,同 mindmap 节点
1 | <node TEXT="2017.04.22 确认" MODIFIED="1492867311580" ID="3i0vobk9ovfplks8s78drjktki" CREATED="1492867311580"/> |
- 特殊标签 —— 图标
1 | <icon BUILTIN="bookmark"/> |
- 问题:xmind bug,图片所在节点的文字不会导出到 freemind 中。
1 | <node TEXT="<html><img src="images/57hi95enuhcl1c15525mg15r1o.png">" MODIFIED="1492867311580" ID="0ed31t5hvpa6hfevf213pollgh" CREATED="1492867311580" POSITION="right"> |
综上,需归递解析出 freemind 的每个 node 标签,并分析是否为叶子节点,根据是否叶子节点判断excel row 是否加一,将 node 标签的 TEXT 属性值写入 excel 第 row 行,第 level 列。
第一版 —— xml 递归解析
参考代码
参考代码,Python - How to determine hierarchy level of parsed XML elements? 中 pradyunsg 的回答,通过递归的获取子节点的形式达到获取 xml 等级的目的。
原代码:
1 | import xml.etree.ElementTree as ET |
适配到 freemind 的解析
实现获取属性 ‘TEXT’,参考 xml.etree.ElementTree — The ElementTree XML API。
1 | #!/usr/bin/python |
使用到的 python 语法:
- if 语句,通过
is not None
判断非空。
第二版 —— 导出为 excel
缺点:使用全局变量
1 | #!/usr/bin/python |
使用到的 Python 语法:
- 字符串判空,
if a == b
,注意 is 是用于判断是否同一个对象。 - list 判空,
if not a
。 全局变量,在函数前定义,在函数内要定义为 global
etree.ElementTree
- 获取 elementTree 树对象,parse(source)
- 获取 element 对象,getroot
- 获取 tag 的值,elem.tag
- 获取首个标签为 node 的 element,elem.find(‘node’)
- 获取属性 TEXT 的值,elem.get(‘TEXT’)
xlwt
- 实例化,xlwt.workbook()
- 添加 sheet,add_sheet
- 保存 xls 文件,save
- 写数据,write
第三版 —— 带参数解析
- python 参数解析内嵌库 argparse
- python 参数解析方法汇总,Python中的命令行解析工具介绍
- python argparse 使用详解,argparse - 命令行选项与参数解析(译)
本文只需要带个参数,一是输入文件,二是输出文件,其中输入文件为必选选项,输出文件为可选,输出文件默认为 freemind2excel.xls。
源码:
1 | #!/usr/bin/python |
运行结果:
1 | sunnogo@DESKTOP-VM2TU8I:~/workshop/xmind2excel$ ./xmind2excel.py |