navicat 17 不支持导入 powerdesigner 等工具生成的 xmi/emx 等复杂 xml 模型文件,仅识别根节点为 dataset/records/table、记录用同名无嵌套子节点(如 row/record)、字段节点名一致且无属性的扁平 xml 结构;建模工具导出的 xml 需经 python 脚本归一化转换后方可导入。
navicat 17 不支持导入其他建模工具(如 powerdesigner、er/studio、mysql workbench)生成的 xml 模型文件。这不是操作路径没找对,而是功能根本不存在。
它能处理的 XML,仅限两类:
- 导出向导生成的「表结构 XML」(含
、
标签) - 导入向导接受的「扁平数据 XML」(如
)1 foo 而建模工具导出的 XML 通常是 XMI、EMX、或带命名空间的复杂结构(含
、 、 等), Navicat的 XML 解析器会直接报Invalid XML structure或跳过整段。
Navicat 17 能识别的 XML 结构长什么样?
你必须确认源 XML 满足三个硬性条件,缺一不可:
- 根节点是单一、无命名空间的标签,比如
dataset、Records、table(Navicat 文档明确列出的可选根名) - 所有记录用同名、同层级、无嵌套的子节点包裹,例如
row或Record - 每个记录内,字段节点名必须完全一致(不能有的多
created_at,有的少status),且不能含属性(<field name="id">123</field>不行)
常见错误现象:
- 导入向导走到「选择标签」页时,下拉菜单为空或只显示
#document - 点击「下一步」后提示
No record found,哪怕文件里明明有几百行 - 字段映射页只出现 1 列,或所有值都为
NULL
怎么把建模工具的 XML 转成 Navicat 能认的格式?
没有通用转换器,但可写一个轻量 Python 脚本做结构归一化。核心逻辑是:提取实体定义 → 统一包装为
row→ 塞进dataset根。假设你拿到的是 PowerDesigner 导出的 EMX(含
CPackage和CClass),关键步骤如下:- 用
xml.etree.ElementTree解析,忽略命名空间(ET.register_namespace('', '')) - 定位所有实体节点(如
.//CClass),逐个提取属性:name、code、comment - 构造新
row元素,子节点严格按顺序固定为:table_name、column_name、data_type、is_nullable - 所有文本内容用
.text = str(val) or ''避免 None 引发异常
示例片段:
import xml.etree.ElementTree as ET root_out = ET.Element("dataset") for cls in tree.findall(".//CClass"): row = ET.SubElement(root_out, "row") ET.SubElement(row, "table_name").text = cls.findtext("Name") or "" ET.SubElement(row, "column_name").text = cls.findtext("Code") or "" ET.SubElement(row, "data_type").text = "VARCHAR(255)" ET.SubElement(row, "is_nullable").text = "YES" ET.ElementTree(root_out).write("navicat_ready.xml", encoding="utf-8", xml_declaration=True)注意:别用
lxml自动补全或美化输出——Navicat 对换行不敏感,但美化可能插入或 BOM 头导致解析失败。
为什么不用 Navicat 自带的「导入模型」功能?
Navicat 17的「模型」模块(Model → Import Model)只接受以下格式:-
.mwb(MySQL Workbench) -
.pdman(PowerDesigner 的精简版导出,非标准 XML) -
.erwin(ER/Studio 专有二进制)
它根本不解析任何 .xml 扩展名的模型文件。界面上看不到「XML」选项,不是隐藏了,是压根没实现。
如果你手头只有 XML,唯一可行路径是:先用建模工具另存为它支持的格式(如 Workbench 支持导出
.mwb),再导入;否则必须脚本中转。
真正容易被忽略的一点:Navicat 对 XML 的解析是纯标签名匹配,不校验语义。它不会关心
<row><id>1</id><name>foo</name></row>是用户数据还是表结构——只要标签名和目标表字段能手动映射上,就能灌进去。所以转换时不必还原建模逻辑,只需保证字段名、顺序、层级三者稳定即可。 - 导入向导接受的「扁平数据 XML」(如











