長い投稿になります。準備していただきありがとうございます:-)この質問は、この投稿の1つ上の「ビュー」からのものです。
(C#/ Java)からクラスを生成するXSDがあります。したがって、問題は2つの異なる部分に分割されます。XSDで定義してから、そこからデータモデルを作成します。
メタ情報を運ぶために複合型にいくつかの要素を入れたいのですが、XSDの特定のxパスだけに入れたいのです。つまり、ある型が別の複合型の要素として再利用される場合、それが何かに「関連する」かどうかをユーザーに伝えたいということです(他の投稿ではセキュリティ関連と呼んでいます)。関連性はいくつかのレベルで示されます。(その説明はもちろんC#/ Javaのデータモデルにも当てはまります)
XSDタイプの例:
<xs:complexType name="Core">
<xs:sequence>
<xs:element name="No" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ComplexA">
<xs:sequence>
<xs:element name="Info" type="Core" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ComplexB">
<xs:sequence>
<xs:element name="Info" type="Core" />
</xs:sequence>
</xs:complexType>
Coreタイプには、プロパティ「No」があります。このプロパティは、他のタイプに関連する可能性があります。たとえば、タイプは「relevant-level-1」であると想定されていますがComplexA.Info
、ComplexB.Infoではそうではありません。
これを実現するために、2つの異なる方法を考え出しました。
1:タイプレベルで属性を導入します。
<xs:complexType name="ComplexA">
<xs:sequence>
<xs:element name="Info" type="Core" />
</xs:sequence>
<xs:attribute name="Relevance.Info.No" type="RelevanceType" fixed="Relevance1"/>
</xs:complexType>
<xs:simpleType name="RelevanceType">
<xs:restriction base="xs:string">
<xs:enumeration value="Relevance1" />
<!-- Some more relevance values -->
</xs:restriction>
</xs:simpleType>
属性「Relevance.Info.No」は、基本的に、メンバー「Info」のプロパティ「No」が関連性タイプ「Relevance1」であることを示しています。このアプローチには明らかにいくつかの欠点があります。この属性情報を手動で処理する必要があるため、クラスの生成は非常に複雑です。その解決策は、冒頭で述べたスレッドに掲載されています。
2:関連性レベルを持つすべてのプロパティに別の複合タイプを導入します。
これにより、この「メタデータ」がプロパティにアタッチされる方法が解決されますが、タイプ内の関連性レベルのすべての組み合わせに対して、XSDおよびC#/Javaで多くのクラスが表示されます。
ご想像のとおり、C#およびJava側でのデータモデルの作成に関する問題は、XSD内の問題と非常によく似ています。最善の方法は、生成されたコードを他に操作することなく、XSDでJavaクラス(JaxB)とC#クラス(XGen)を自動的に作成できるようにすることです(これは現在行っています)。
それを達成するための他の可能性はありますか?
どんな助けでも大歓迎です!