Mixed 屬性繫結支援
本主題專門說明舊有技術。 應該使用下列建立 XML Web Service 及 XML Web Service 用戶端: Windows Communication Foundation.
.NET Framework 會提供 mixed 屬性 (Attribute) 的部分繫結支援。
如果要由擴充功能定義複雜型別,Xsd.exe 工具就等同於 mixed="true"
XML 屬性,而此屬性具有已套用 XmlTextAttribute 的字串陣列欄位。
說明
mixed 屬性可以出現在 complexType 和 complexContent 項目中。true
值表示項目可能包含子項目或本文 (也就是不具型別的字元資料) 或兩者都有。
<complexContent> 的 mixed 值會根據 XML 結構描述覆寫 <complexType> 的 mixed 值。如果 <complexContent> 項目存在,則會是 <complexType> 項目的唯一子項目。
Xsd.exe 會將 mixed 屬性的 true
設定對應到具有 System.Xml.Serialization.XmlTextAttribute 屬性的字串陣列欄位,如下所示:
[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;
XmlText 屬性會告知 XmlSerializer 類別,將類別成員序列化為本文。繫結可以雙向運作:從類別產生 .xsd 檔,以及從 .xsd 檔產生原始檔。
利用擴充功能衍生型別。
XML 結構描述規格禁止使用擴充功能在混合內容和僅含項目的內容之間切換:
XML 結構描述禁止藉由擴充具有非混合子項目的複雜型別,以混合內容來建立複雜型別。
同樣地,XML 結構描述禁止藉由擴充具有混合內容的複雜型別,以非混合子項目來建立複雜型別。
從 XML 結構描述文件產生原始程式碼時,如果 Xsd.exe 遇到其中一種不合法的擴充功能,就會發出下列警告:
結構描述驗證警告:衍生型別和基底型別必須具備相同的內容型別。
同時,Xsd.exe 會將先前所述具有 XmlText 屬性的字串陣列欄位放在衍生類別中,而該衍生類別已引入混合內容。這會使任何子代 (Descendant) 都具有混合內容。
當祖系複雜型別具有子項目,且子代複雜型別指定 mixed="true"
時,就會發出先前的警告。當祖系複雜型別針對 mixed 屬性指定 true
值,且子代複雜型別未在 <complexContent> 或 <complexType> 項目中明確指定 true
值時,也會發出警告。
一般而言,從組件的一組類別中產生 XML 結構描述文件時,Xsd.exe 會將下列項目中的 mixed 屬性設定為 true
:
<complexType>:用於已引入混合內容的複雜型別。型別會對應到類別,而該類別包含具有 XmlText 屬性的字串陣列欄位。資料型別不必是基底複雜型別,結構描述也同樣可以有效,稍後會在本主題中詳細說明。
<complexContent>:用於子代複雜型別。
即使如此,當使用 XML 結構描述文件時,Xsd.exe 還是會接受 <complexType mixed="true">
,以表示子代型別的繼承混合內容,甚至預設的 <complexContent mixed="false">
都應該加以覆寫。在從產生的程式碼進行的反向轉譯上,會還原預期的表單,如下所示:
<complexType>
<complexContent mixed="true">
...
</complexContent>
</complexType>
有一種情況可以將混合內容引入衍生複雜型別:基底複雜型別未包含任何子項目 (但是可能具備屬性)。但是,在這種情況下,Xsd.exe 在雙向轉譯上會產生具有不同涵義的 XML 結構描述。
必須指定引入混合內容的衍生型別,如下所示:
<complexType>
<complexContent mixed="true">
...
</complexContent>
</complexType>
在反向轉譯上,Xsd.exe 會切換 mixed="true"
的位置,如下列摘錄所示:
<complexType mixed="true">
<complexContent mixed="false">
...
</complexContent>
</complexType>
在這裡根據 XML 結構描述,<complexContent> 項目的 false
值應該可以覆寫 <complexType> 項目的 true
值,使衍生型別的內容變成非混合,並與原本的目的相抵觸。
針對引入混合內容的複雜型別,如果 <complexType> 項目存在,Xsd.exe 永遠會在這個項目中將 mixed 屬性設定為 true
,而不是在 <complexContent> 項目中設定,因而發生這個錯誤。
同樣地,當 Xsd.exe 接收這項反向輸出做為輸入時,會讓具備 XmlText 屬性的字串陣列欄位成為對應類別的成員,因而一致地將衍生型別解譯為引入的混合內容。如前所述,Xsd.exe 會接受 <complexType mixed="true">
,以表示子代型別的繼承混合內容,即使 <complexContent mixed="false>
應該加以覆寫。
利用限制衍生型別
XML 結構描述允許限制具有混合內容的複雜型別,以衍生具有非混合子項目的複雜型別。但是 .NET Framework 無法辨識複雜型別限制。Xsd.exe 改為建立繼承自基底類別的空類別。請參閱 <restriction> 項目。
可能的包含項目:<complexContent>、<complexType>
另請參閱
參考
System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed