Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过脚本从XMI正确导入完整的企业架构师项目?_Python_Xml_Scripting_Enterprise Architect - Fatal编程技术网

Python 如何通过脚本从XMI正确导入完整的企业架构师项目?

Python 如何通过脚本从XMI正确导入完整的企业架构师项目?,python,xml,scripting,enterprise-architect,Python,Xml,Scripting,Enterprise Architect,从一个正在运行的EA实例和一个打开的空项目(只包含一个空的根节点)开始,我试图编写一个简单的脚本,从.xmi文件导入一个完整的EA项目。我知道使用GUI可以很容易地完成,但我需要将该功能用于另一个问题 当我用GUI导入EA项目的.xmi时,我收到一条消息说 'XMI包含一个可以放置在项目浏览器根级别的模型。按“是”以根模型导入,按“否”以放置在所选包的下 并且可以选择这样做。(通过将项目从EA导出到.xmi,创建了.xmi文件) 当我运行脚本(见下文)时,它似乎选择了其中一个选项,这取决于我不知

从一个正在运行的EA实例和一个打开的空项目(只包含一个空的根节点)开始,我试图编写一个简单的脚本,从.xmi文件导入一个完整的EA项目。我知道使用GUI可以很容易地完成,但我需要将该功能用于另一个问题

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

'XMI包含一个可以放置在项目浏览器根级别的模型。按“是”以根模型导入,按“否”以放置在所选包的下

并且可以选择这样做。(通过将项目从EA导出到.xmi,创建了.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)
所以条带GUID为零!这将在不询问的情况下替换模型的内容。完成后,浏览器中的模型将折叠,所有内容都将被替换。做那种事时你应该小心

现在,如果您的导入包含一个根节点,您将被迫执行一些额外的工作。EA将根作为视图放置在空的新根下。不太好

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

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

p = repository.getPackageByGUID(guid) 
以确定正确的导入包

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


注意:条带GUID意味着EA将为任何内容创建新元素。这是用于创建副本(如模式)。如果要恢复,则必须而不是启用条带GUID!这将使EA使用该GUID替换现有元素(事实上,这有点复杂,但基本上就是这样)。

您可能需要一些变通方法来完成此操作

  • 创建一个临时包以在其中进行导入
  • 在这个临时包中导入您的xmi文件
  • 导入后,在临时包
    Packages
    集合中获取新包
  • 将新包的父ID设置为0
  • Update()
    您的新软件包
  • 刷新模型视图(0)
    以在项目浏览器中查看新模型结构

谢谢您的回答!恐怕我不完全明白。如果导入项目的任何guid已经存在于空项目中,是否会产生差异?这意味着空项目的根节点将有一个?如果是这样,我需要做什么?我的目标是将XMI文件中的整个项目放回EA,恢复其原始结构,因此根节点应该位于根级别。更改条带GUID参数似乎不会对结果产生任何影响。我已经详细解释了条带GUID。我已经测试了该行为。再次感谢您提供的其他解释。因此,根的GUID会起作用。我可能会始终使用一个base.eapx文件,该文件始终具有相同的根,用于从导入和导出到。就我所做的测试而言,我得到了期望的行为。再次感谢您进一步扩展您的答案。从XMI文件中提取根GUID对我有效,并导致预期结果。将ParentID设置为0会为我调用错误。我发现另一个可行的解决方法是将根包的原始子级重新定位一个更高的级别,方法是将它们的ParentID设置为根ID,然后删除放错位置的前根节点。嗯,好的,我想你想作为根节点导入?如果仍然需要,您可以从Repository.Models()创建一个新的rootnode
repository.SQLQuery("SELECT ea_guid FROM t_packages WHERE ea_guid = '%s'" % guid)
p = repository.getPackageByGUID(guid)