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

标签 python xml scripting enterprise-architect

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

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

'XMI 包含一个模型,它可以放置在项目浏览器的根级别。按 Yes 导入为 Root Model,No 放置在选定的包下'

并且可以选择这样做。 (.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 会将根作为 View 放置在空的新根下。不好。

作为一些解决方法,您可能首先阅读您的 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 很容易做到。您只需要创建一个临时文件即可在以后的导入中使用。另请注意,格式与 native 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)

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

p = repository.getPackageByGUID(guid) 

为了查明正确的导入包。

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

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

关于python - 如何通过脚本从 XMI 正确导入一个完整的 Enterprise Architect 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64024592/

相关文章:

xml - android XML 命名空间的故事是什么?

linux - 用于连接两列并在另一个文件中查找连接值的 awk 脚本

linux - Pam.exec 退出代码 8

xml - 使用 DTD,是否可以声明一个允许任何 XML 内容的元素?

python - 提高 Python 3.4 中大字典的速度

javascript - 将大型图像文件和视频上传到 Google Cloud Storage

python - 如何使用 MySQL Connector/Python 创建临时表?

xml - 如果类型等于类型或从类型派生,如何检查 xPath

scripting - GRUB 脚本中的文件名通配符扩展

python - setup.py 示例?