Attribute 項目繫結支援
.NET Framework 會提供 <attribute> 項目的繫結支援。
然而,Xsd.exe 不會區別區域宣告的屬性 (Attribute) 和全域宣告屬性的參考,除非全域屬性是在結構描述的目標命名空間 (Namespace) 以外的命名空間中宣告。
說明
XML 結構描述規格說明屬性可以在複雜型別定義中區域宣告,或是全域宣告,而當全域宣告屬性時,一或多個複雜型別定義可以透過 ref 屬性參考該屬性。
下列為區域宣告屬性的範例:
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
下列為全域宣告而後參考的同一個屬性:
<xsd:attribute name="name" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute ref="name"/>
</xsd:complexType>
Xsd.exe 不會區別區域宣告的屬性和全域宣告屬性的參考,除非全域屬性是在結構描述的目標命名空間以外的命名空間中宣告。
相同命名空間中的參考
Xsd.exe 在相同命名空間不做任何區別,因此,從 XML 結構描述轉譯至類別,然後又反向轉譯時,會建立區域屬性以取代全域屬性和參考。
參考其他命名空間
如果參考的全域宣告屬於不同的命名空間,則 Xsd.exe 會使用套用至所產生欄位的 XmlAttributeAttribute 屬性 (Attribute) 的 Namespace 屬性 (Property) 指定命名空間。對於該特定項目,透過 Namespace 屬性 (Property) 指定的命名空間會使用 XmlTypeAttribute 屬性 (Attribute) 和選用的 XmlRootAttribute,覆寫在類別層級指定的命名空間。範例如下:
[System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]
public string Key;
使用 <import> 項目將其他命名空間匯入 XML 結構描述定義。
範例
第一個範例顯示當定義全域屬性的目標命名空間含有該屬性的參考時,Xsd.exe 會如何處理這個全域屬性。
輸入 XML 結構描述文件:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://example.org/" targetNamespace="http://example.org/" elementFormDefault="qualified">
<xsd:attribute name="version" type="xsd:string"/>
<xsd:complexType name="keyInfo">
<xsd:attribute ref="version" />
<xsd:attribute name="public" type="xsd:boolean" use="required"/>
</xsd:complexType>
<xsd:element name="key" type="keyInfo"/>
</xsd:schema>
由前面的 XML 結構描述文件所產生的 C# 類別:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
[System.Xml.Serialization.XmlAttributeAttribute()]
public string version;
[System.Xml.Serialization.XmlAttributeAttribute()]
public bool @public;
}
編譯自前面 C# 原始檔而得之組件所產生的 XML 結構描述文件:
<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="key" type="tns:keyInfo" />
<xs:complexType name="keyInfo">
<xs:attribute name="version" type="xs:string" />
<xs:attribute name="public" type="xs:boolean" />
</xs:complexType>
</xs:schema>
在前面產生的 XML 結構描述中,本來是全域宣告的版本屬性已經變成區域屬性。
第二個範例顯示當全域屬性定義於不同的命名空間中時,Xsd.exe 會如何處理該屬性的參考。這個範例會使用 <import> 項目,匯入位於不同的 XSD 檔中的第二個命名空間 (<import> 項目的 schemaLocation 屬性不是用來指定所匯入 .xsd 檔的位置,而是針對 Xsd.exe 將檔案指定為其他命令列引數)。
用來當做輸入的最上層 XML 結構描述文件:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns="http://example.org/" targetNamespace="http://example.org/" xmlns:attr="http://example.org/attr">
<xsd:import namespace="http://example.org/attr" />
<xsd:element name="key" type="keyInfo" />
<xsd:complexType name="keyInfo">
<xsd:attribute ref="attr:version" />
<xsd:attribute name="public" type="xsd:boolean" use="required" />
</xsd:complexType>
</xsd:schema>
用來當做輸入的匯入 XML 結構描述文件:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns="http://example.org/attr" targetNamespace="http://example.org/attr">
<xsd:attribute name="version" type="xsd:string" />
</xsd:schema>
由前面兩個 XML 結構描述文件所產生的 C# 類別:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("key", Namespace="http://example.org/", IsNullable=false)]
public class keyInfo {
[System.Xml.Serialization.XmlAttributeAttribute(Namespace="http://example.org/attr")]
public string version;
[System.Xml.Serialization.XmlAttributeAttribute()]
public bool @public;
}
從前面 C# 來源編譯之組件產生的最上層 XML 結構描述文件:
<xs:schema xmlns:tns="http://example.org/" elementFormDefault="qualified" targetNamespace="http://example.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://example.org/attr" />
<xs:element name="key" type="tns:keyInfo" />
<xs:complexType name="keyInfo">
<xs:attribute xmlns:q1="http://example.org/attr" ref="q1:version" />
<xs:attribute name="public" type="xs:boolean" />
</xs:complexType>
</xs:schema>
匯入的 XML 結構描述文件會從前面 C# 原始檔所編譯的組件而產生:
<xs:schema xmlns:tns="http://example.org/attr" elementFormDefault="qualified" targetNamespace="http://example.org/attr" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:attribute name="version" type="xs:string" />
</xs:schema>
Use 屬性
<attribute> 宣告的 use 屬性會判斷屬性是否可以或必須出現在 XML 執行個體文件中。
Use 屬性:從 XML 結構描述文件產生原始程式碼
Xsd.exe 解譯 use 屬性的 optional
值的方式,會根據是否已透過 default 屬性指定預設屬性值而有所不同。以下列出 use 的值以及各自的 Xsd.exe 輸出,其中包括 optional
和 default 組合:
required
:Xsd.exe 會使用 System.Xml.Serialization.XmlAttributeAttribute 產生公用欄位。已指定 default 的
optional
:Xsd.exe 使用 XmlAttributeAttribute 加上指定預設值的 System.Component.DefaultValueAttribute,產生公用欄位。未指定 default 的
optional
:Xsd.exe 會使用 XmlAttributeAttribute 產生公用欄位。此外,如果屬性 (Attribute) 的型別不是參考型別 (例如,字串),便會產生型別 bool 的公用欄位,其名稱為該屬性欄位的名稱附加上Specified
。例如,如果屬性欄位的名稱為startDate
,bool 欄位的名稱就會變成startDateSpecified
。將物件序列化為 XML 時,XmlSerializer 類別會檢查 bool 欄位的值,以判斷是否撰寫選擇性屬性。bool 欄位會和 System.Xml.Serialization.XmlIgnoreAttribute 一起顯示,以避免被 XmlSerializer 序列化。prohibited
:Xsd.exe 不會產生任何項目。
Use 屬性:從類別產生 XML 結構描述文件
在下列任一情況中,Xsd.exe 都不會指定 use 屬性,而是會還原為預設值 optional
:
有遵循
Specified
命名慣例的額外公用 bool 欄位存在。透過型別 System.Component.DefaultValueAttribute 的屬性將預設值指派給成員。
如果這些條件都不符合,則 Xsd.exe 會針對 use 屬性產生 required
值。
範例:Use 屬性
輸入 XML 結構描述複雜型別:
<xsd:complexType name="Numbers">
<xsd:attribute name="optionalNumber" type="xsd:int" use="optional"/>
<xsd:attribute name="requiredNumber" type="xsd:int" use="required"/>
<xsd:attribute name="prohibitedNumber" type="xsd:int" use="prohibited"/>
</xsd:complexType>
由前面的複雜型別所產生的 C# 類別:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://example.org/", IsNullable=false)]
public class Numbers {
[System.Xml.Serialization.XmlAttributeAttribute()]
public int optionalNumber;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool optionalNumberSpecified;
[System.Xml.Serialization.XmlAttributeAttribute()]
public int requiredNumber;
}
由前面的 C# 類別產生的複雜型別會有效等同於原始複雜型別。
可能的屬性 | 繫結支援 |
---|---|
default |
如果執行個體文件中的項目是空白的,或是找不到屬性,default 屬性就會提供所要使用的預設值。 從 XML 結構描述產生原始程式碼時,Xsd.exe 工具會讓每個欄位都對應到具有預設值的屬性,並套用 System.ComponentModel.DefaultValueAttribute,以傳遞預設值當做引數。此外,Xsd.exe 會將欄位靜態初始化為預設值,如下列範例所示:
此外,從結構描述產生原始程式碼時,Xsd.exe 會檢查是否已經指定 default 屬性,以判斷如何解譯具有 Xsd.exe 工具無法針對具有預設值的清單型別屬性,產生有效的原始程式碼。這種情況將會與 default 屬性一起說明。同時,請參閱 <list> 項目。 |
fixed |
至於 <attribute> 宣告,Xsd.exe 使用 fixed 屬性的值以統計方式將欄位初始化為固定值,如下例所示:
請參閱 fixed 屬性。 |
form |
Xsd.exe 工具等同於 <attribute> 項目的 form XML 屬性 (Attribute),該項目具有 XmlAttributeAttribute 的 Form 屬性 (Property)。.NET Framework 的 XML 序列化基礎結構會辨識 XML 結構描述的預設值 如果 XML 結構描述中的 <attribute> 宣告指定 請參閱 form 屬性。 |
id |
Xsd.exe 公用程式忽略試圖提供唯一識別項的 id 屬性。相反地,Xsd.exe 會辨認 name 屬性。 |
name |
從 XSD 文件產生原始程式碼時,name 屬性的值會提供公用類別欄位的名稱,此欄位代表該屬性。如果名稱與保留的關鍵字衝突,則所產生的名稱前面會加上 @ 符號。 當 Xsd.exe 從公用類別欄位產生 <attribute> 宣告時,會使用欄位名稱當做 name 屬性的值。透過 AttributeName 屬性 (Property) 可以提供替代名稱 name 屬性 (Attribute) 值。 請參閱 Name 屬性繫結支援 屬性。 |
ref |
從 XML 結構描述複雜型別產生 .NET Framework 型別時,除非在結構描述目標命名空間之外的命名空間中宣告全域屬性,否則 Xsd.exe 不會區別區域宣告的屬性和對全域宣告之屬性的參考。 請參閱「相同命名空間中的參考」和「參考其他命名空間」等節。 |
type |
如果使用 <attribute> 和 <element> 宣告的 type 屬性參考資料型別,則 Xsd.exe 工具會使該資料型別與 .NET Framework 型別產生關聯。 除非可以追蹤 XML 結構描述資料型別,返回透過 type 屬性參考該資料型別的全域項目宣告,否則 Xsd.exe 不會針對該資料型別產生 .NET Framework 型別。 |
use |
如果為 請參閱上一個章節「Use 屬性」。 |
可能的父項目:<attributeGroup>、<complexType>、<extension>、<restriction>、<schema>
可能的子項目:<annotation>、<simpleType>
請參閱
參考
Copyright © 2007 by Microsoft Corporation. All rights reserved.