有道云笔记有脑图功能,我平时经常用到,之所以很少用到其他脑图工具,是因为我一直用有道云笔记写笔记。因此编辑脑图和查看脑图比较方便,但是需要将脑图导出的时候目前只支持图片和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 jsonimport xmindimport sysimport 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)
if __name__ == \\’__main__\\’: if len(sys.argv) != 3: print(f\\’usage: {sys.argv[0]} input.mindmap save.xmind\\’) exit(0) convert_mindmap_xmind(sys.argv[1], sys.argv[2])
最终效果,上面那个有道云笔记的结构完美转换为下面的xmind,然后就可以通过xmind导出成各种格式,满足大家的所有需求了。
总结
生活中有很多技巧都需要我们去发现,并找到解决方案。想一想自己的需求是不是大家的需求,如果是那就有解决的价值。反正我有了这个方案就可以放心地在有道云笔记上写脑图了。如果需要发布给其他人看,就通过我的这个项目导出成xmind,然后通过xmind导出成各种格式文件。