前言
使用 Codex 制作 XMind 文件时,可能会遇到以下现象:文件可以打开,但提示文件损坏;或者点击底部的"+"增加一个 Tab,再保存时,XMind 弹出"使用了较旧的 XMind 版本来创建"的提示,甚至无法正常保存。
本文记录问题的原因和修复方法。核心思路是:不要使用旧版 XML 格式或不匹配的元数据,而是根据当前 XMind 版本生成正确的 JSON 工作簿格式。按照本文方法处理后,可以解决文件打开异常、保存失败和版本兼容性提示等问题。
一、问题现象
使用旧版 Python xmind 库生成的 .xmind 文件,在新版 XMind 中可能出现以下错误:
text
TypeError: Cannot read properties of undefined (reading 'getAttribute')
还有一种更隐蔽的情况:
- 文件能够正常打开并显示思维导图。
- 点击底部的"+"新增一个工作表(Tab)。
- 执行保存操作。
- 软件提示"使用了较旧的 XMind 版本来创建"。
这类文件不一定真的损坏,通常是文件格式或元数据版本落后于当前 XMind 版本。
二、问题原因
1. 使用了旧版 XML 格式
旧版 Python xmind 库通常生成 XML 格式的 XMind 文件,压缩包中包含:
text
content.xml
styles.xml
comments.xml
meta.xml
META-INF/manifest.xml
新版 XMind 虽然可能尝试兼容读取这些文件,但在读取旧样式、元数据或主题结构时,可能出现渲染错误或崩溃。
2. JSON 格式的元数据版本不匹配
即使文件使用了 content.json,如果元数据仍然写成旧版本,例如:
json
{
"creator": {"name": "生成工具名称"},
"dataStructureVersion": "2"
}
当前 XMind 可能仍然能够打开文件,但会把它识别为旧版本文件。新增 Tab 或保存时,软件会进行兼容性检查,因此出现"使用了较旧的 XMind 版本来创建"的提示。
三、正确的 XMind 文件结构
.xmind 文件本质上是一个 ZIP 压缩包。对于简单的新版 JSON 工作簿,至少应包含:
text
content.json
metadata.json
manifest.json
不要将旧版的 content.xml、styles.xml、comments.xml 与新版 JSON 文件混合在同一个包中。
四、content.json 的基本结构
content.json 的顶层必须是 Sheet 数组,而不是单个对象:
json
[
{
"id": "唯一的 sheet id",
"class": "sheet",
"title": "工作表标题",
"topicPositioning": "free",
"rootTopic": {
"id": "唯一的根主题 id",
"class": "topic",
"title": "中心主题",
"children": {
"attached": [
{
"id": "唯一的子主题 id",
"class": "topic",
"title": "子主题"
}
]
}
}
}
]
注意事项:
- 顶层必须是数组
[...]。 - 每个 Sheet 和 Topic 都必须有唯一的
id。 - Sheet 的
class必须是sheet。 - Topic 的
class必须是topic。 - 子主题放在
children.attached数组中。
五、当前 XMind 26.5 的原生元数据
本机验证的 XMind 版本为 26.5.1106,程序版本标识为 26.05.01106。如果目标是让当前 XMind 直接编辑和保存,并且不出现旧版本提示,建议使用以下元数据:
json
{
"creator": {
"name": "Vana",
"version": "26.05.01106"
},
"dataStructureVersion": "3",
"layoutEngineVersion": "5",
"activeSheetId": "必须等于 content.json 中当前工作表的 id"
}
字段说明:
| 字段 | 含义 |
|---|---|
creator.name |
XMind 原生创建者标识,使用 Vana |
creator.version |
当前 XMind 的程序版本 |
dataStructureVersion |
数据结构版本,XMind 26.5 使用 3 |
layoutEngineVersion |
布局引擎版本,XMind 26.5 使用 5 |
activeSheetId |
当前工作表 ID,必须与 content.json 中的 Sheet ID 一致 |
不要随意写入类似 Codex、1.0 的自定义创建者信息,否则仍可能被 XMind 识别为外部生成或旧版本生成的文件。
六、manifest.json 的基本结构
json
{
"file-entries": {
"content.json": {},
"metadata.json": {}
}
}
如果压缩包中还有图片、附件等资源,应同时将对应路径加入 file-entries。
七、生成时的注意事项
-
使用 UTF-8 编码保存 JSON,中文可以直接写入,建议不要写入 BOM。
-
为每个 Sheet 和 Topic 生成不同的 UUID。
-
使用
ZIP_STORED无压缩方式打包最稳妥,XMind 原生保存也使用compression: "STORE"。 -
备注使用以下结构:
json{"notes": {"plain": {"content": "备注内容\n"}}} -
不要使用只支持旧 XML 格式的 Python
xmind库作为最终写入器。
八、验证 XMind 文件
1. 查看压缩包内容
powershell
tar -tf sample_map.xmind
正常情况下,至少可以看到:
text
content.json
metadata.json
manifest.json
2. 使用 Python 解析 JSON
python
import json
import zipfile
with zipfile.ZipFile("sample_map.xmind") as z:
content = json.loads(z.read("content.json"))
metadata = json.loads(z.read("metadata.json"))
print(type(content))
print(metadata)
content 应该是列表,metadata 中应包含对应版本字段。
3. 使用 XMind 验证编辑和保存
- 关闭已经打开的旧文件。
- 重新打开修复后的
.xmind文件。 - 点击底部"+"新增一个 Tab。
- 执行保存。
不应再出现"使用了较旧的 XMind 版本来创建"的提示。
4. 检查 XMind 日志
Windows 下可以检查以下目录:
text
%APPDATA%\Xmind\Electron v3\vana\log\app_YYYY-M-D.log
%APPDATA%\Xmind\Electron v3\vana\state\editors.json
如果文件成功打开,editors.json 中通常会记录文件路径、Sheet ID 和当前选中主题。
九、版本选择建议
不同目标版本可以使用不同的元数据:
| 使用场景 | 建议格式 |
|---|---|
| 当前 XMind 26.5 编辑和保存 | JSON v3、layoutEngineVersion: "5"、Vana 26.05.01106、activeSheetId |
| 兼容较老版本 XMind | JSON v2、layoutEngineVersion: "3" |
JSON v2 更适合旧版兼容,但在新版 XMind 中编辑和保存时,可能出现旧版本提示。面向当前 XMind 使用时,应优先生成 JSON v3 原生格式。
十、总结
XMind 文件"能打开"并不代表它已经符合当前软件的原生格式。遇到文件损坏、保存失败或新增 Tab 后出现旧版本提示时,重点检查以下内容:
- 是否误用了旧版 XML 文件格式。
content.json顶层是否为数组。- Sheet 和 Topic 的 ID 是否唯一。
dataStructureVersion是否匹配当前 XMind。layoutEngineVersion是否正确。activeSheetId是否存在且与 Sheet ID 一致。creator信息是否使用了当前 XMind 的原生标识。
按照上述格式重新生成并打包 .xmind 文件,即可解决 Codex 生成 XMind 时常见的文件损坏、无法保存和版本兼容性提示问题。