如何通过脚本从 XMI 正确导入一个完整的 Enterprise Architect 项目?

How to correctly import a complete Enterprise Architect project from XMI by script?

从 EA 的 运行ning 实例开始,打开一个空项目(仅由一个空的根节点组成),我试图编写一个简单的脚本来从 .xmi 导入完整的 EA 项目文件。我知道可以使用 GUI 轻松完成,但我需要使用该功能来解决另一个问题。

当我使用 GUI导入 EA 项目的 .xmi时,我收到一条消息说

'XMI contains a Model which may be placed at the root level in the Project Browser. Press Yes to import as Root Model, No to place under selected package'

并且可以选择这样做。 (.xmi 文件已通过将项目从 EA 导出到 .xmi 而创建)

当我 运行 脚本(见下文)时,它似乎选择了其中一个选项,具体取决于我不知道的内容。大多数情况下,将导入项目的根节点放在已经存在的空根目录下。所以项目结构比较混乱

这是脚本:

repo = eaApp.Repository
root = repo.Models[0]
projectInterface = repo.GetProjectInterface() 
newPkgGUID = projectInterface.ImportPackageXMI(root.PackageGUID, XMISourcePath, 1, 1) # actual import

我基本上想做的是我总是想把导入项目的根节点放在根级别,但是从GUI操作时弹出的对话框似乎无法访问。

对这个问题有什么建议吗?

脚本写在Python.

我刚刚测试了这个。为了加载 XMI,您需要 运行

newPkgGUID = projectInterface.ImportPackageXMI(root.PackageGUID, XMISourcePath, 1, 0)

所以 Strip GUID 为零!这将在不询问的情况下替换模型的内容。完成后,浏览器中的模型将折叠起来,所有内容都已替换。做那种事情的时候要小心。

现在,如果您的导入包含根节点,您将不得不做一些额外的工作。 EA 会将根作为视图放置在空的新根下。不好看

作为一些解决方法,您可能首先阅读您的 XMI 并修改其中的根 GUID,使其与您的新模型相同。该 GUID 是(例如在此导出中)

<XMI.content>
    <UML:Model name="EA Model" xmi.id="MX_EAID_16B64057_C8E3_4697_A31B_3ABB87DB4D64">
        <UML:Namespace.ownedElement>
            <UML:Class name="EARootClass" xmi.id="EAID_11111111_5487_4080_A7F4_41526CB0AA00" isRoot="true" isLeaf="false" isAbstract="false"/>
            <UML:Package name="Model" xmi.id="EAPK_16B64057_C8E3_4697_A31B_3ABB87DB4D64" isRoot="true" isLeaf="false" isAbstract="false" visibility="public">

上面最后一行(在您的 XMI 的最开头)。使用 Python 这很容易做到。您只需要创建一个临时文件即可在以后的导入中使用。另请注意,格式与本机 EA GUID 不同。所以原来的 EA GUID 应该是 {16B64057-C8E3-4697-A31B-3ABB87DB4D64}.


旧答案

基本上这是典型的半生不熟的 Sparx API。但是,您需要通过发出查询

在包中查找目标 GUID
repository.SQLQuery("SELECT ea_guid FROM t_packages WHERE ea_guid = '%s'" % guid)

如果结果 returns 一行,您就知道目标已经存在并且您已做出相应的反应。这意味着您必须导入找到的包。你也可以做一个

p = repository.getPackageByGUID(guid) 

为了查明正确的导入包。

让我感到奇怪的是,您使用的是 Strip GUID,它在任何情况下都应该创建一个与您放置它的位置无关的导入的新副本。我认为对话框不会弹出并选中 Strip GUID。

N.B。剥离 GUID 意味着 EA 将为任何内容创建 new 元素。这是为了创建副本(如图案)。如果您想恢复,您必须而不是打开 Strip GUID!这将使 EA 用该 GUID 替换现有元素(实际上它有点复杂,但基本上就是这样)。

您可能需要一些变通方法才能执行此操作。

  • 创建一个临时包以在
  • 中进行导入
  • 在此临时包中导入您的 xmi 文件
  • 导入后在您的临时包中获取新包 Packages 集合
  • 将新包的 ParentID 设置为 0
  • Update() 你的新包裹
  • RefreshModelView(0) 在项目浏览器中查看新的模型结构。