Eclipse 如何强制EMF不操纵引用ID

Eclipse 如何强制EMF不操纵引用ID,eclipse,eclipse-emf,bpmn,emf,eclipse-emf-ecore,Eclipse,Eclipse Emf,Bpmn,Emf,Eclipse Emf Ecore,有了下面的代码,我正在加载一个BPMN模型 // dummy URI, loading done through input stream URI uri = URI.createURI("data.bpmn"); ResourceSet resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(uri, "org.eclipse.bpmn2.content-type.xml"); re

有了下面的代码,我正在加载一个BPMN模型

// dummy URI, loading done through input stream
URI uri = URI.createURI("data.bpmn");
ResourceSet resourceSet = new ResourceSetImpl();
Resource resource = resourceSet.createResource(uri, "org.eclipse.bpmn2.content-type.xml");
resource.load(contentStream, null);
保存资源
resource.save(outputStream,null)
操作输出并将
data.bpmn 
添加到引用:

<bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="data.bpmn#StartEvent_1">
    <dc:Bounds height="36.0" width="36.0" x="162.0" y="182.0"/>
        <bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="data.bpmn#BPMNLabelStyle_1">
            <dc:Bounds height="15.0" width="68.0" x="146.0" y="218.0"/>
        </bpmndi:BPMNLabel>
</bpmndi:BPMNShape>

从输入流中看起来像这样:

<bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
    <dc:Bounds height="36.0" width="36.0" x="162.0" y="182.0"/>
        <bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="BPMNLabelStyle_1">
            <dc:Bounds height="15.0" width="68.0" x="146.0" y="218.0"/>
        </bpmndi:BPMNLabel>
</bpmndi:BPMNShape>

有没有办法强制EMF不操纵引用?

更改此选项:

 URI uri = URI.createURI("data.bpmn");

您必须在data.bpmn中注册任何包定义,才能使用ResourceSet的/global包注册表进行EPackage

如果您正在从流、XML等加载data.bpmn

资源接口包括save()和load()方法的第二个版本,其中包括一个流参数:

无效保存(OutputStream OutputStream, 映射选项)引发IOException; 无效加载(InputStream InputStream,映射选项)引发IOException;
您可能认为这意味着EMF资源本质上是“基于流的”。尽管EMF使用的大多数资源往往是基于流的,包括EMF提供的XML资源,但也可以实现非基于流的(例如,关系数据库)资源……

我就是这样解决的:

ResourceSet resourceSet = new ResourceSetImpl();
XMLResource resource = (XMLResource) resourceSet.createResource(modelUri, "org.eclipse.bpmn2.content-type.xml");
XMLResource.URIHandler uriHandler = new URIHandlerImpl() {
    @Override
    public URI deresolve(URI uri) {
        // make sure references are stored without # URI prefix
        return URI.createURI(uri.fragment());
    }
};
resource.getDefaultSaveOptions().put(XMLResource.OPTION_URI_HANDLER, uriHandler);

resource.load(inputStream, null);
resource.save(空);是错误的,我实际使用了resource.save(outputStream,null);如果我使用createPlatformResourceURI(),那么“StartEvent_1”也会变成“#StartEvent_1”,如果我使用createFileURI()。有什么办法可以处理吗?
ResourceSet resourceSet = new ResourceSetImpl();
XMLResource resource = (XMLResource) resourceSet.createResource(modelUri, "org.eclipse.bpmn2.content-type.xml");
XMLResource.URIHandler uriHandler = new URIHandlerImpl() {
    @Override
    public URI deresolve(URI uri) {
        // make sure references are stored without # URI prefix
        return URI.createURI(uri.fragment());
    }
};
resource.getDefaultSaveOptions().put(XMLResource.OPTION_URI_HANDLER, uriHandler);

resource.load(inputStream, null);