簡體   English   中英

“某些”元素的XSD屬性

[英]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繼承了此類型

您可以使用CoreComplexA ,你可以用CoreBaseComplexB

<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模式Xsd中的繼承鏈接和繼承

就像我在對答案的評論中所說的那樣,我認為沒有一個干凈的解決方案。 也許XML不打算像這樣使用。
但是我仍然會對其他解決方案感興趣...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM