使用 PyEcore 从 EMF/XMI 资源获取 UUID

问题描述 投票:0回答:1

我有一个在 Java/EMF 程序中序列化的 XMI 文件。现在,我需要使用 PyEcore 读取它,并且我想设置 UUID,然后在迭代资源时检索它。

这是我当前的代码:

from os import path as osp
from pathlib import Path

#PyEcore
from pyecore.resources import URI

xmi_path = osp.join(RESOURCES_PATH, 'models', 'my_model.xmi')
m_resource = resource_set.get_resource(URI(xmi_path))
m_resource.use_uuid = True
#save resource with UUIDs at temporary directory
m_resource.save(output=URI(osp.join(RESOURCES_PATH, 'models', 'temp', 'my_model_uuid_version.xmi')))


for obj in m_resource.contents[0].eAllContents():
    obj_type= obj.eClass.name
    #obj_uuid = What should I do here?
    #print(obj_uuid)

我查看了文档,但什么也没找到。我试图“猜测”一些可能性,比如

getID()
obj.eGet('xmi_uuid')
,但一切都失败了。由于延迟加载,
dir(obj)
也没有给我任何提示。

下面是成功保存在“models/temp/my_model_uuid_version.xmi”的文件的一部分(这意味着代码的第一部分没有问题)。原始(Java)版本是使用 URI 片段而不是 id 创建的。

<?xml version='1.0' encoding='UTF-8'?>
<emf.modeling.test:Root xmlns:xmi="http://www.omg.org/XMI" xmlns:emf.modeling.test="emf.modeling.test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmi:id="2def7906-85ad-4852-ad4b-a4db577a14c6" xmi:version="2.0">
  <regions xmi:id="b4b7b97c-9549-4700-b51c-cc3a68166a71">
    <vertices xsi:type="emf.modeling.test:Entry" xmi:id="a7ca20d5-c2bb-4ff9-a8f6-c9c53e496a83">
      <out xmi:id="6f0a5530-14a0-41fa-91de-681df25f9aff" target="f1bfedb7-41a7-4582-b736-71f804ffe65d"/>
    </vertices>
    <vertices xsi:type="emf.modeling.test:State" xmi:id="f1bfedb7-41a7-4582-b736-71f804ffe65d" incomingTransitions="6f0a5530-14a0-41fa-91de-681df25f9aff 59290d7f-032c-460c-a158-f4ed83dcdaba 3aa3a4ea-f7fc-495f-aaec-d7b957bc9c86 4c4264ff-1cdb-45e8-bdc4-289f23aa668d 94b5a479-f5aa-4de5-b5e5-93b61a676af7 b979f49a-bb16-43b0-abee-2808653d7342 6270c0fd-6e8a-4667-bde9-d77636e60762 7014ca4f-fa00-4ea0-abf4-772bab9f6f1e 58b0e66e-73e7-4c0c-9b7b-4ba319ec7350 ecc020db-7c64-4cc8-9b9e-d29b6692c799 e04b9856-8b90-4d6c-a64b-14173cd72e8c dd54139d-32eb-4374-abb3-115d6d53cd61 a10a2db2-9a0c-47bd-8b77-307f8a21ed15">
      <out xmi:id="c06a3aeb-e86b-4dec-837e-d28f92cb7ef9" target="582156e7-c756-462d-aaaa-f9348d96813d"/>
      <out xmi:id="a70aec31-886f-477e-9c25-b641341e52c4" target="d609bdde-e299-40d1-84f5-104fd975a287"/>
    </vertices>
    <!--...more vertices-->
  </regions>
</emf.modeling.test:Root>
python uuid eclipse-emf
1个回答
0
投票

PyEcore 处理 uuid 的方式是在序列化后为每个元素设置一个特殊属性

_internal_id
。要检索资源设置的 uuid,您可以这样转换代码:

from os import path as osp
from pathlib import Path

#PyEcore
from pyecore.resources import URI

xmi_path = osp.join(RESOURCES_PATH, 'models', 'my_model.xmi')
m_resource = resource_set.get_resource(URI(xmi_path))
m_resource.use_uuid = True
#save resource with UUIDs at temporary directory
m_resource.save(output=URI(osp.join(RESOURCES_PATH, 'models', 'temp', 'my_model_uuid_version.xmi')))


for obj in m_resource.contents[0].eAllContents():
    obj_type= obj.eClass.name
    obj_uuid = obj._internal_id
    print(obj_uuid)

EObjects 对

dir(...)
的反应方式已被调整,因此这就是为什么你无法直接找到此类低级信息的原因。如果您想查看对象的内部,并知道您将获得比您需要的更多的信息,您可以使用
obj.__dict__
。这将使您了解 PyEcore 的内部机制,并且您还会在那里看到
_internal_id
属性。

这种情况没有记录在案,因为它并不是该库的真正经典用法,即使在 EMF Java 中,这种情况也不是经常出现的。不过我应该为此写点东西......

© www.soinside.com 2019 - 2024. All rights reserved.