将XSD转换为ECore

时间:2013-01-17 10:33:27

标签: eclipse eclipse-plugin eclipse-emf eclipse-emf-ecore

我目前正在尝试使用Eclipse Modeling Framework将XML Schema转换为ECore。 EMF提供attributre ecore:引用以指示属性应转换为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-elelemts的ids只在环绕的A元素内部是唯一的。因此,如果我将B元素的id声明为类型ID,则解析器将抛出错误。

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

1 个答案:

答案 0 :(得分:3)

如果XML Schema确实使用了ID和IDREF,那么您显示的实例对该架构无效。这不是问题吗?它更像是密钥/ keyref,Ecore也不支持。

如果它只是想要一个可以读写这些实例的Ecore模型,我会定义一个属性idref,它只是一个字符串,并定义一个类型A和I的瞬态引用resolvedRef d修改getter和setter,使每个getter和setter从另一个中明智地派生出来。即,当你调用getResolvedRef时,它会检查该字段是否为空,如果idref的字段有值,它会走模型来解析(查找该名称)适当的范围)并将其存储在现场。

对于getter和两个setter来说,以合理的方式定义相互推导是有点棘手的,但它应该是可能的。