Eclipse 将XSD转换为ECore

Eclipse 将XSD转换为ECore,eclipse,eclipse-plugin,eclipse-emf,eclipse-emf-ecore,Eclipse,Eclipse Plugin,Eclipse Emf,Eclipse Emf Ecore,我目前正在尝试使用Eclipse建模框架将XML模式转换为ECore。EMF提供attributere ecore:reference来指示应该将属性转换为EReference。但是,这仅在属性的类型为IDREF或anyURI时有效。我的问题是,通过IDREF引用的任何ID在整个XML文档中都必须是唯一的。但是,我的XML具有以下结构: <A id="a1"> <B id="b1"> <ref idref="b2" /> </B> <B id

我目前正在尝试使用Eclipse建模框架将XML模式转换为ECore。EMF提供attributere ecore:reference来指示应该将属性转换为EReference。但是,这仅在属性的类型为IDREF或anyURI时有效。我的问题是,通过IDREF引用的任何ID在整个XML文档中都必须是唯一的。但是,我的XML具有以下结构:

<A id="a1">
<B id="b1">
<ref idref="b2" />
</B>
<B id="b2">
<ref idref="b1" />
</B>
</A>

<A id="a2">
<B id="b1">
<ref idref="b2" />
</B>    
<B id="b2">
<ref idref="b1" />
</B>
</A>

B元素的ID仅在A元素内部是唯一的。因此,如果我将B元素的ID声明为type ID,解析器将抛出一个错误


如何告诉EMF idref是对属于同一个a元素的B元素的属性id的引用?

如果XML模式确实使用id和idref,那么您显示的实例对于该模式无效。这不是个问题吗?它更像一个key/keyref,Ecore也不支持它

如果归结为需要一个能够读写这样的实例的Ecore模型,我会定义一个属性
idref
,它只是一个字符串,并定义一个类型为a的瞬态引用
resolvedRef
,我会修改getter和setter,以便它们都能从对方合理地派生。也就是说,当您调用
getResolvedRef
时,它将检查该字段是否为空,如果
idref
的字段有值,它将遍历模型进行解析(在适当的范围内查找该名称)并将其存储在字段中


对于getter和setter来说,以合理的方式定义相互派生有点棘手,但这应该是可能的。

你完全正确。事实上,我在我的模式中使用了key/keyref。我刚刚尝试了ID/IDREF以查看EMF将生成什么。但我真正需要的是key/keyref。我已经读过关于临时参考的文章。你能解释一下它们是什么吗?如果我理解正确,我唯一的解决方案就是手动编辑生成的代码。是这样吗?临时引用只是XML序列化程序不会序列化的引用。是的,解决方案是为两个setter和getter专门化生成的代码。您需要解决的一些棘手问题是,如果您已解析引用并更改被引用对象的名称(id),是否希望自动序列化新名称?您可以尝试的最简单的方法是使用可变false的临时引用,因此它只有一个getter,没有setter,您可以将解析idref的所有逻辑放在该方法中。