有道云笔记有脑图功能 我平时经常用到 之所以很少用到其他脑图工具 是因为我一直用有道云笔记写笔记。因此编辑脑图和查看脑图比较方便 但是需要将脑图导出的时候目前只支持图片和xmind 但是需要开会员 由于囊中羞涩 所以我想了别的方案。
解决方案我找到xmind的官方GitHub https://github.com/xmindltd 找到了python的SDK 看了下有python和java以及js这三个sdk 但是Java和python的sdk已经不维护了 不过还是可以用的 就是新功能可能用不了。
找到了生成xmind的方法 但是如何将有道云笔记脑图的源文件拿到呢 还得分析一下源文件格式 写写算法去进行转换。之前导出过有道云笔记 知道好多文件都是明文保存 没有加密啥的 因此我用everything搜索了我的文件名 还真找到了办法。如下图所示 就是我找到的文件名 然后通过文件搜索工具搜到了源文件位置。
下面是我的思维导图的源文件 用文本方式打开 发现就是一个简单的json格式。
下面就是json内容 实际就是每个节点都有父节点id 根节点没有父节点 每个节点组成一个数组 这种格式处理最好用的就是递归的方法。
{
nodes : [
id : root ,
isroot : true,
topic : 测试脑图 ,
customStyle : {
fontFamily : [
Microsoft YaHei ,
STXihei
link : null,
expanded : true,
parentid : null,
style : {}
id : a231f89912e42e5b ,
topic : 分支主题1 ,
customStyle : {
fontFamily : [
Microsoft YaHei ,
STXihei
borderColor : #4D94FF
expanded : true,
parentid : root ,
style : {}
readonly : false,
toolbar : {
lineType : default ,
strategy : logic_right ,
zoom : 1,
loading : true,
borderColor : #4D94FF
remarks : {},
version : 2.0 ,
resourceList :
}
动手操作
我的所有代码都放到GitHub https://github.com/jan-bar/mindmap_to_xmind 如果有兴趣 可以去看看 核心代码如下 没有太复杂的东东。
import json
import xmind
import sys
import os
def convert_mindmap_xmind(input_file, save_file):
data_dict {} # 将节点保存到字典中
with open(input_file, r , encoding utf-8 ) as f:
json_data json.load(f)
for node in json_data[ nodes ]:
data_dict[node[ id ]] {
id : node[ id ],
parentid : node[ parentid ],
topic : node[ topic ],
sub_topic : {},
data_root None
for val in data_dict.values():
if val[ id ] root :
data_root val # 保存根节点
elif n : data_dict.get(val[ parentid ]):
# 当前节点挂到父节点下
n[ sub_topic ][val[ id ]] val
if data_root is None:
print( 数据有误,没有找到根节点 )
return
# print(json.dumps(data_root)) # 可以打印看看结果
if os.path.exists(save_file):
os.remove(save_file) # 目标文件存在则删除
mind xmind.load(save_file)
sheet1 mind.getPrimarySheet()
# 获取sheet并设置名称为输入文件名
sheet1.setTitle(os.path.basename(input_file))
root1 sheet1.getRootTopic()
# 设置属性为: 逻辑图(向右), 和有道云笔记保持一致
root1.setAttribute( structure-class , org.xmind.ui.logic.right )
def set_topic(root, val_data):
root.setTitle(val_data[ topic ])
for sub_val in val_data[ sub_topic ].values():
set_topic(root.addSubTopic(), sub_val)
set_topic(root1, data_root) # 递归设置子节点
xmind.save(mind, save_file)


