这将是一篇很长的文章,感谢您的准备:-) 这个问题来自这篇文章的一个更高级别的“观点”:
我们有一个 XSD,我们将从(C#/Java)生成类。所以问题分为两个不同的部分:在 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>
核心类型具有属性“否”。此属性可能与其他类型相关。例如,它应该是 type 中的“relevant-level-1” ComplexA.Info
,而在 ComplexB.Info 中不是。
我们想出了两种不同的方法来实现这一点:
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),而无需对生成的代码进行任何其他操作(我现在正在这样做)。
您认为实现这一目标的任何其他可能性吗?
任何帮助表示赞赏!