[英]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.