2013-01-17 76 views
1

我目前正在尝试使用Eclipse Modeling Framework将XML Schema转换为ECore。 EMF提供attributionre ecore:引用来指示应该将属性转换为EReference。但是,这只适用于属性是IDREF或anyURI类型的情况。我的问题是,通过IDREF引用的任何ID必须通过整个XML文档是唯一的。然而,我的XML的结构如下:将XSD转换为ECore

<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的ID仅在sourrounding A-元素中是唯一的。因此,如果我将B元素的id声明为类型ID,则解析器将引发错误。

如何判断EMF idref是否属于同一A元素的B元素的属性ID的引用?

回答

3

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

如果只是归结为想Ecore模型,可以读取和写入这样的情况下我会定义属性idref这只是一个字符串,定义A型的瞬态参考resolvedRef,我会修改getter和setter等等每个人都明智地从另一个派生出来。也就是说,当你打电话给getResolvedRef时,它会检查那个字段是否为空,如果idref的字段有一个值,它将使模型解析(在适当范围内查找该名称)并将其存储在场。

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

+0

你完全正确。事实上,我在我的模式中使用key/keyref。我只是尝试了ID/IDREF来查看EMF会产生什么。但我真正需要的是key/keyref。我已经阅读过关于瞬时引用。你能解释他们是什么吗?如果我正确理解你,我唯一的解决方法是手动编辑生成的代码。这是正确的吗? – mupro

+0

瞬态引用只是一个不会被XML序列化器序列化的引用。是的,解决方案是专门为两个设置者和获取者生成代码。如果你已经解决了引用并且改变了被引用的东西的名字(id),你会希望自动序列化这个新名字吗?你可以尝试的最简单的方法是带有可变假的瞬态引用,所以只有一个getter,没有setter,你可以把所有的逻辑用于解析idref。 –