[英]XSD attribute for “some” elements
这将是一篇很长的文章,谢谢您的准备:-)这个问题来自这篇文章的一个“观点”上层:
我们有一个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>
核心类型具有属性“否”。 此属性可能与其他类型相关。 例如,它被认为是“相关级别-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),而无需对生成的代码进行任何其他操作(我现在正在做)。
您是否看到实现这一目标的其他可能性?
任何帮助表示赞赏!
在这种情况下,我相信您需要使用继承。 如果您定义了另一个称为CoreBase
类型,并且在Core
继承了此类型
您可以使用Core
的ComplexA
,你可以用CoreBase
在ComplexB
<xs:complexType name="CoreBase">
<xs:sequence>
... some attributes or how ever you wish
</xs:sequence>
</xs:complexType>
<complexType name="Core">
<complexContent>
<extension base="CoreBase">
<sequence>
<xs:element name="No" type="xs:int" />
</sequence>
</extension>
</complexContent>
</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="CoreBase" />
</xs:sequence>
</xs:complexType>
就像我在对答案的评论中所说的那样,我认为没有一个干净的解决方案。 也许XML不打算像这样使用。
但是我仍然会对其他解决方案感兴趣...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.