如何使用PyEcore从EMF/XMI资源中获取UUID
如何使用PyEcore从EMF/XMI资源中获取UUID
看起来你前面的步骤都做对了——已经成功启用UUID支持并保存了带UUID的XMI文件,只是在获取UUID的时候找错了方式!
在PyEcore中,当你开启了use_uuid=True后,资源对象(也就是你的m_resource)会负责管理所有对象的UUID,而不是每个对象自身直接暴露一个可直接访问的属性(这也是为什么你用dir(obj)看不到相关属性,懒加载机制的影响)。
你需要调用资源的get_id()方法,把要查询的对象作为参数传进去,就能拿到对应的UUID了。修改你的循环代码如下:
from os import path as osp from pathlib import Path from pyecore.resources import URI # 假设RESOURCES_PATH已经定义 xmi_path = osp.join(RESOURCES_PATH, 'models', 'my_model.xmi') m_resource = resource_set.get_resource(URI(xmi_path)) m_resource.use_uuid = True # 保存带UUID的资源到临时目录 m_resource.save(output=URI(osp.join(RESOURCES_PATH, 'models', 'temp', 'my_model_uuid_version.xmi'))) # 遍历并获取每个对象的UUID for obj in m_resource.contents[0].eAllContents(): obj_type = obj.eClass.name obj_uuid = m_resource.get_id(obj) # 这行是关键! print(f"Object Type: {obj_type}, UUID: {obj_uuid}")
另外补充一个小知识点:如果之后你需要手动给某个对象设置自定义UUID,可以使用资源的set_id()方法,示例如下:
# 给指定对象设置UUID m_resource.set_id(some_object, "my-custom-uuid-12345")
设置完成后保存资源,新的UUID就会写入到XMI文件中。
备注:内容来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

