2013-01-17 2 views
1

현재 Eclipse Modeling Framework를 사용하여 XML 스키마를 ECore로 변환하려고합니다. EMF는 속성이 EReference로 변환되어야 함을 나타내는 속성을 제공합니다. 그러나이 속성이 IDREF 또는 anyURI 유형 인 경우에만 작동합니다. 내 문제는 IDREF를 통해 참조 된 모든 ID가 전체 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-요소 내부에서만 고유 :하지만, 내 XML은 다음과 같은 구조를 가지고 있습니다. 따라서 파서는 B 요소의 ID를 유형 ID로 선언하면 오류가 발생합니다.

idref가 동일한 A 요소에 속한 B 요소의 속성 ID에 대한 참조임을 EMF에 어떻게 알릴 수 있습니까?

답변

3

XML 스키마가 실제로 ID와 IDREF를 사용하는 경우 표시하는 인스턴스가 해당 스키마와 관련하여 유효하지 않습니다. 그게 문제가 아닌가? 이것은 Ecore가 지원하지 않는 key/keyref와 비슷합니다. 그냥 그런 경우를 읽고 쓸 수는 Ecore 모델을 원하는 내려 오면

난 그냥 문자열의 속성 idref을 정의하고 A 형의 과도 참조 resolvedRef을 정의하고 나는 getter 및 setter를 이렇게 수정 줄 것이다 각각이 다른 하나로부터 합리적으로 이끌어 낸다. 예를 들어, getResolvedRef을 호출하면 해당 필드가 null인지 확인하고 idref 필드에 값이 있으면 해당 범위에서 해당 이름을 찾아서 해결하기 위해 모델을 걸을 것입니다. 필드.

getter와 setter 모두에게 합리적인 방법으로 상호 유도를 정의하는 것은 약간 까다 롭지 만 가능해야합니다.

+0

귀하는 완전히 옳습니다. 사실, 내 스키마에서 key/keyref를 사용하고 있습니다. EMF가 생성하는 것을보기 위해 ID/IDREF를 시도했습니다. 하지만 정말로 필요한 것은 key/keyref입니다. 나는 일시적인 참조에 대해 이미 읽었습니다. 그들이 무엇인지 설명해 주시겠습니까? 만약 당신이 정확하게 내 유일한 해결책을 수동으로 생성 된 코드를 편집 이해합니다. 이게 옳은 거니? – mupro

+0

일시적인 참조는 XML serializer에서 직렬화되지 않는 참조입니다. 예, 솔루션은 두 명의 setter 및 getter에 대해 생성 된 코드를 특수화하는 것입니다. 당신이 참조를 해결하고 참조 된 것의 이름 (id)을 변경하는 것과 같은 작업이 필요한 까다로운 일들은 새로운 이름이 자동으로 직렬화되기를 바라겠습니까? 시도 할 수있는 가장 간단한 방법은 변경 가능한 false를 가진 일시적인 참조입니다. 따라서 getter 만 있고 setter가 없으며 해당 메서드에서 idref를 해결하기위한 모든 논리를 넣을 수 있습니다. –