本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

XmlReader 類別

 

表示提供快速、非快取、順向 (Forward-only) 存取 XML 資料的讀取器 (Reader)。

若要瀏覽此類型的.NET Framework 原始程式碼,請參閱 Reference Source

命名空間:   System.Xml
組件:  System.Xml (於 System.Xml.dll)


public abstract class XmlReader : IDisposable

名稱描述
System_CAPS_protmethodXmlReader()

初始化 XmlReader 類別的新執行個體。

名稱描述
System_CAPS_pubpropertyAttributeCount

在衍生類別中覆寫時,取得目前節點上的屬性數目。

System_CAPS_pubpropertyBaseURI

在衍生類別中覆寫時,取得目前節點的基底 URI。

System_CAPS_pubpropertyCanReadBinaryContent

取得值,這個值表示 XmlReader 是否會實作二進位內容讀取方法。

System_CAPS_pubpropertyCanReadValueChunk

取得值,表示 XmlReader 是否會實作 ReadValueChunk 方法。

System_CAPS_pubpropertyCanResolveEntity

取得值,指出這個讀取器是否可以剖析和解析實體。

System_CAPS_pubpropertyDepth

在衍生類別中覆寫時,取得 XML 文件中目前節點的深度。

System_CAPS_pubpropertyEOF

在衍生類別中覆寫時,取得指出讀取器是否在資料流結尾的值。

System_CAPS_pubpropertyHasAttributes

取得值,表示目前節點是否具有任何屬性。

System_CAPS_pubpropertyHasValue

當在衍生類別中覆寫時,取得值,指出目前節點是否可以具有 Value

System_CAPS_pubpropertyIsDefault

在衍生類別中覆寫時,取得值,指出目前節點是否為從 DTD 或結構描述中定義的預設值產生的屬性。

System_CAPS_pubpropertyIsEmptyElement

當在衍生類別中覆寫時,取得值,指出目前節點是否為空項目 (例如, <MyElement/>)。

System_CAPS_pubpropertyItem[Int32]

在衍生類別中覆寫時,取得具有指定索引的屬性值。

System_CAPS_pubpropertyItem[String]

當在衍生類別中覆寫時,取得具有指定之屬性的值 Name

System_CAPS_pubpropertyItem[String, String]

當在衍生類別中覆寫時,取得具有指定之屬性的值 LocalNameNamespaceURI

System_CAPS_pubpropertyLocalName

在衍生類別中覆寫時,取得目前節點的區域名稱。

System_CAPS_pubpropertyName

在衍生類別中覆寫時,取得目前節點的限定名稱。

System_CAPS_pubpropertyNamespaceURI

在衍生類別中覆寫時,取得讀取器所在節點的命名空間 URI (如 W3C 命名空間規格中所定義)。

System_CAPS_pubpropertyNameTable

當在衍生類別中覆寫時,取得 XmlNameTable 與這個實作關聯。

System_CAPS_pubpropertyNodeType

在衍生類別中覆寫時,取得目前節點的類型。

System_CAPS_pubpropertyPrefix

在衍生類別中覆寫時,取得與目前節點相關聯的命名空間前置詞。

System_CAPS_pubpropertyQuoteChar

在衍生類別中覆寫時,取得用來括住屬性節點值的引號字元。

System_CAPS_pubpropertyReadState

在衍生類別中覆寫時,取得讀取器的狀態。

System_CAPS_pubpropertySchemaInfo

取得在結構描述驗證之後已指派給目前節點的結構描述資訊。

System_CAPS_pubpropertySettings

取得 XmlReaderSettings 物件,用於建立這個 XmlReader 執行個體。

System_CAPS_pubpropertyValue

在衍生類別中覆寫時,取得目前節點的文字值。

System_CAPS_pubpropertyValueType

取得目前節點的 Common Language Runtime (CLR) 類型。

System_CAPS_pubpropertyXmlLang

當在衍生類別中覆寫時,取得目前 xml:lang 範圍。

System_CAPS_pubpropertyXmlSpace

當在衍生類別中覆寫時,取得目前 xml:space 範圍。

名稱描述
System_CAPS_pubmethodClose()

當在衍生類別中覆寫時,會變更 ReadStateClosed

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream)

使用指定的資料流,以預設設定建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream, XmlReaderSettings)

使用指定的資料流及設定,建立新的 XmlReader

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream, XmlReaderSettings, String)

使用指定的資料流、基底 URI 和設定,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream, XmlReaderSettings, XmlParserContext)

使用指定的資料流、設定和內容資訊進行剖析,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(String)

使用指定的 URI,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(String, XmlReaderSettings)

使用指定的 URI 和設定,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(String, XmlReaderSettings, XmlParserContext)

使用指定的 URI、設定和內容資訊進行剖析,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader)

使用指定的文字讀取器,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader, XmlReaderSettings)

使用指定的文字讀取器及設定,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader, XmlReaderSettings, String)

使用指定的文字讀取器、設定和基底 URI,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader, XmlReaderSettings, XmlParserContext)

使用指定的文字讀取器、設定和內容資訊進行剖析,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodSystem_CAPS_staticCreate(XmlReader, XmlReaderSettings)

使用指定的 XML 讀取器和設定,建立新的 XmlReader 執行個體。

System_CAPS_pubmethodDispose()

釋放 XmlReader 類別目前的執行個體所使用的全部資源。

System_CAPS_protmethodDispose(Boolean)

釋放 XmlReader 所使用的 Unmanaged 資源,並選擇性地釋放 Managed 資源。

System_CAPS_pubmethodEquals(Object)

判斷指定的物件是否等於目前的物件。(繼承自 Object。)

System_CAPS_protmethodFinalize()

允許物件在記憶體回收進行回收之前,嘗試釋放資源並執行其他清除作業。 (繼承自 Object。)

System_CAPS_pubmethodGetAttribute(Int32)

在衍生類別中覆寫時,取得具有指定索引的屬性值。

System_CAPS_pubmethodGetAttribute(String)

當在衍生類別中覆寫時,取得具有指定之屬性的值 Name

System_CAPS_pubmethodGetAttribute(String, String)

當在衍生類別中覆寫時,取得具有指定之屬性的值 LocalNameNamespaceURI

System_CAPS_pubmethodGetHashCode()

做為預設雜湊函式。(繼承自 Object。)

System_CAPS_pubmethodGetType()

取得目前執行個體的 Type(繼承自 Object。)

System_CAPS_pubmethodGetValueAsync()

非同步取得目前節點的值。

System_CAPS_pubmethodSystem_CAPS_staticIsName(String)

傳回值,指出字串引數是否為有效的 XML 名稱。

System_CAPS_pubmethodSystem_CAPS_staticIsNameToken(String)

傳回值,指出字串引數是否為有效的 XML 名稱語彙基元。

System_CAPS_pubmethodIsStartElement()

呼叫 MoveToContent 並測試目前的內容節點為開始標記或空白項目標記。

System_CAPS_pubmethodIsStartElement(String)

呼叫 MoveToContent 並測試目前的內容節點為開始標記或空白項目標記,以及如果 Name 找到項目的屬性符合指定的引數。

System_CAPS_pubmethodIsStartElement(String, String)

呼叫 MoveToContent 並測試目前的內容節點為開始標記或空白項目標記,以及如果 LocalNameNamespaceURI 找到項目的屬性會比對指定的字串。

System_CAPS_pubmethodLookupNamespace(String)

在衍生類別中覆寫時,解析目前項目範圍內的命名空間前置詞。

System_CAPS_protmethodMemberwiseClone()

建立目前 Object 的淺層複製。(繼承自 Object。)

System_CAPS_pubmethodMoveToAttribute(Int32)

在衍生類別中覆寫時,移至具有指定索引的屬性。

System_CAPS_pubmethodMoveToAttribute(String)

當在衍生類別中覆寫時,移至具有指定屬性 Name

System_CAPS_pubmethodMoveToAttribute(String, String)

當在衍生類別中覆寫時,移至具有指定屬性 LocalNameNamespaceURI

System_CAPS_pubmethodMoveToContent()

檢查目前節點是否為內容 (非泛空白字元文字、 CDATA, ,Element, ,EndElement, ,EntityReference, ,或 EndEntity) 節點。 如果節點並非內容節點,讀取器會先跳至下一個內容節點或檔案結尾。 它會略過下列型別的節點:ProcessingInstructionDocumentTypeCommentWhitespaceSignificantWhitespace

System_CAPS_pubmethodMoveToContentAsync()

非同步檢查目前節點是否為內容節點。 如果節點並非內容節點,讀取器會先跳至下一個內容節點或檔案結尾。

System_CAPS_pubmethodMoveToElement()

在衍生類別中覆寫時,移至包含目前屬性節點的項目上。

System_CAPS_pubmethodMoveToFirstAttribute()

在衍生類別中覆寫時,移至第一個屬性。

System_CAPS_pubmethodMoveToNextAttribute()

在衍生類別中覆寫時,移至下一個屬性。

System_CAPS_pubmethodRead()

在衍生類別中覆寫時,從資料流讀取下一個節點。

System_CAPS_pubmethodReadAsync()

非同步讀取資料流中的下一個節點。

System_CAPS_pubmethodReadAttributeValue()

在衍生類別中覆寫,將屬性值剖析成一或多個 Text, ,EntityReference, ,或 EndEntity 節點。

System_CAPS_pubmethodReadContentAs(Type, IXmlNamespaceResolver)

以指定型别的物件形式讀取內容。

System_CAPS_pubmethodReadContentAsAsync(Type, IXmlNamespaceResolver)

以非同步的方式讀取做為指定型别之物件的內容。

System_CAPS_pubmethodReadContentAsBase64(Byte[], Int32, Int32)

讀取內容,並傳回 Base64 已解碼的二進位位元組。

System_CAPS_pubmethodReadContentAsBase64Async(Byte[], Int32, Int32)

以非同步的方式讀取內容,並傳回 Base64 已解碼的二進位位元組。

System_CAPS_pubmethodReadContentAsBinHex(Byte[], Int32, Int32)

讀取內容,並傳回 BinHex 已解碼的二進位位元組。

System_CAPS_pubmethodReadContentAsBinHexAsync(Byte[], Int32, Int32)

以非同步方式讀取內容,並傳回 BinHex 已解碼的二進位位元組。

System_CAPS_pubmethodReadContentAsBoolean()

讀取形式之目前位置的文字內容 Boolean

System_CAPS_pubmethodReadContentAsDateTime()

讀取形式之目前位置的文字內容 DateTime 物件。

System_CAPS_pubmethodReadContentAsDateTimeOffset()

讀取形式之目前位置的文字內容 DateTimeOffset 物件。

System_CAPS_pubmethodReadContentAsDecimal()

讀取形式之目前位置的文字內容 Decimal 物件。

System_CAPS_pubmethodReadContentAsDouble()

以雙精確度浮點數的形式讀取目前位置的文字內容。

System_CAPS_pubmethodReadContentAsFloat()

以單精確度浮點數的形式讀取目前位置的文字內容。

System_CAPS_pubmethodReadContentAsInt()

以 32 位元帶正負號之整數的形式讀取目前位置的文字內容。

System_CAPS_pubmethodReadContentAsLong()

以 64 位元帶正負號之整數的形式讀取目前位置的文字內容。

System_CAPS_pubmethodReadContentAsObject()

讀取形式之目前位置的文字內容 Object

System_CAPS_pubmethodReadContentAsObjectAsync()

以非同步方式讀取做為目前位置的文字內容 Object

System_CAPS_pubmethodReadContentAsString()

讀取形式之目前位置的文字內容 String 物件。

System_CAPS_pubmethodReadContentAsStringAsync()

以非同步方式讀取做為目前位置的文字內容 String 物件。

System_CAPS_pubmethodReadElementContentAs(Type, IXmlNamespaceResolver)

以要求之類型的形式讀取項目內容。

System_CAPS_pubmethodReadElementContentAs(Type, IXmlNamespaceResolver, String, String)

檢查指定的區域名稱和命名空間 URI 是否與目前的項目相符,然後以要求之類型的形式讀取項目內容。

System_CAPS_pubmethodReadElementContentAsAsync(Type, IXmlNamespaceResolver)

以要求之類型的形式,非同步讀取項目內容。

System_CAPS_pubmethodReadElementContentAsBase64(Byte[], Int32, Int32)

讀取項目,並將 Base64 內容解碼。

System_CAPS_pubmethodReadElementContentAsBase64Async(Byte[], Int32, Int32)

以非同步的方式讀取項目,並將 Base64 內容解碼。

System_CAPS_pubmethodReadElementContentAsBinHex(Byte[], Int32, Int32)

讀取項目,並將 BinHex 內容解碼。

System_CAPS_pubmethodReadElementContentAsBinHexAsync(Byte[], Int32, Int32)

以非同步方式讀取項目,並將解碼 BinHex 內容。

System_CAPS_pubmethodReadElementContentAsBoolean()

讀取目前的項目,並傳回內容 Boolean 物件。

System_CAPS_pubmethodReadElementContentAsBoolean(String, String)

會檢查指定之區域名稱和命名空間 URI 符合目前的項目,然後讀取目前的項目,並傳回內容 Boolean 物件。

System_CAPS_pubmethodReadElementContentAsDateTime()

讀取目前的項目,並傳回內容 DateTime 物件。

System_CAPS_pubmethodReadElementContentAsDateTime(String, String)

會檢查指定之區域名稱和命名空間 URI 符合目前的項目,然後讀取目前的項目,並傳回內容 DateTime 物件。

System_CAPS_pubmethodReadElementContentAsDecimal()

讀取目前的項目,並傳回內容 Decimal 物件。

System_CAPS_pubmethodReadElementContentAsDecimal(String, String)

會檢查指定之區域名稱和命名空間 URI 符合目前的項目,然後讀取目前的項目,並傳回內容 Decimal 物件。

System_CAPS_pubmethodReadElementContentAsDouble()

以雙精確度浮點數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsDouble(String, String)

檢查指定的區域名稱和命名空間 URI 是否與目前的項目相符,然後以雙精確度浮點數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsFloat()

以單精確度浮點數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsFloat(String, String)

檢查指定的區域名稱和命名空間 URI 是否與目前的項目相符,然後以單精確度浮點數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsInt()

以 32 位元帶正負號之整數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsInt(String, String)

檢查指定的區域名稱和命名空間 URI 是否與目前的項目相符,然後以 32 位元帶正負號之整數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsLong()

以 64 位元帶正負號之整數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsLong(String, String)

檢查指定的區域名稱和命名空間 URI 是否與目前的項目相符,然後以 64 位元帶正負號之整數的形式,讀取目前的項目並傳回內容。

System_CAPS_pubmethodReadElementContentAsObject()

讀取目前的項目,並傳回內容做為 Object

System_CAPS_pubmethodReadElementContentAsObject(String, String)

會檢查指定之區域名稱和命名空間 URI 符合目前的項目,然後讀取目前的項目,並傳回內容 Object

System_CAPS_pubmethodReadElementContentAsObjectAsync()

非同步讀取目前的項目並傳回內容做為 Object

System_CAPS_pubmethodReadElementContentAsString()

讀取目前的項目,並傳回內容 String 物件。

System_CAPS_pubmethodReadElementContentAsString(String, String)

會檢查指定之區域名稱和命名空間 URI 符合目前的項目,然後讀取目前的項目,並傳回內容 String 物件。

System_CAPS_pubmethodReadElementContentAsStringAsync()

非同步讀取目前的項目,並傳回內容 String 物件。

System_CAPS_pubmethodReadElementString()

讀取純文字項目。 不過,我們建議您使用 ReadElementContentAsString() 方法,因為它提供了較簡單的方式來處理這項作業。

System_CAPS_pubmethodReadElementString(String)

檢查 Name 找到項目的屬性符合指定的字串讀取純文字的項目之前。 不過,我們建議您使用 ReadElementContentAsString() 方法,因為它提供了較簡單的方式來處理這項作業。

System_CAPS_pubmethodReadElementString(String, String)

檢查 LocalNameNamespaceURI 項目的屬性找到符合指定的字串讀取純文字的項目之前。 不過,我們建議您使用 ReadElementContentAsString(String, String) 方法,因為它提供了較簡單的方式來處理這項作業。

System_CAPS_pubmethodReadEndElement()

檢查目前節點為結尾標記,並使讀取器前進至下一個節點。

System_CAPS_pubmethodReadInnerXml()

在衍生類別中覆寫時,將所有的內容當做字串讀取,包括標記。

System_CAPS_pubmethodReadInnerXmlAsync()

以字串形式非同步讀取所有內容,包括標記。

System_CAPS_pubmethodReadOuterXml()

在衍生類別中覆寫時,讀取代表這個節點及其所有子節點的內容,包括標記。

System_CAPS_pubmethodReadOuterXmlAsync()

非同步讀取表示這個節點及其所有子系的內容,包括標記。

System_CAPS_pubmethodReadStartElement()

檢查以確定目前節點為項目,然後使讀取器前進至下一個節點。

System_CAPS_pubmethodReadStartElement(String)

檢查目前的內容節點為項目指定 Name 並使讀取器前進至下一個節點。

System_CAPS_pubmethodReadStartElement(String, String)

檢查目前的內容節點為項目指定 LocalNameNamespaceURI 並使讀取器前進至下一個節點。

System_CAPS_pubmethodReadString()

在衍生類別中覆寫時,將項目或文字節點的內容當做字串讀取。 不過,我們建議您使用 ReadElementContentAsString 方法,因為它提供了較簡單的方式來處理這項作業。

System_CAPS_pubmethodReadSubtree()

傳回新 XmlReader 可以用來讀取目前節點及其所有子系的執行個體。

System_CAPS_pubmethodReadToDescendant(String)

往前推進 XmlReader 到下一步的子代項目具有指定限定名稱。

System_CAPS_pubmethodReadToDescendant(String, String)

往前推進 XmlReader 與指定之區域名稱和命名空間 URI 的下一個子系元素。

System_CAPS_pubmethodReadToFollowing(String)

在找到具有指定限定名稱的項目之前讀取。

System_CAPS_pubmethodReadToFollowing(String, String)

在找到具有指定區域名稱和命名空間 URI 的項目之前讀取。

System_CAPS_pubmethodReadToNextSibling(String)

往前推進 XmlReader 下一個同層級項目,具有指定限定名稱。

System_CAPS_pubmethodReadToNextSibling(String, String)

XmlReader 前移到下一個具有指定區域名稱和命名空間 URI 的同層級項目。

System_CAPS_pubmethodReadValueChunk(Char[], Int32, Int32)

讀取 XML 文件中內嵌之大量文字資料流。

System_CAPS_pubmethodReadValueChunkAsync(Char[], Int32, Int32)

以非同步的方式讀取 XML 文件中內嵌之大量文字資料流。

System_CAPS_pubmethodResolveEntity()

當在衍生類別中覆寫時,會解析實體參考 EntityReference 節點。

System_CAPS_pubmethodSkip()

略過目前節點的子節點。

System_CAPS_pubmethodSkipAsync()

以非同步的方式略過目前節點的子節點。

System_CAPS_pubmethodToString()

傳回代表目前物件的字串。(繼承自 Object。)

System_CAPS_note注意

若要檢視此類型的.NET Framework 原始程式碼,請參閱 Reference Source 您可以瀏覽原始碼、 下載的離線,參考並逐步執行 (包含修補程式和更新),在偵錯。see instructions.

XmlReader 提供 document 或資料流中的 XML 資料的順向、 唯讀存取。 這個類別符合 W3C Extensible Markup Language (XML) 1.0 (fourth edition)Namespaces in XML 1.0 (third edition) 建議。

XmlReader方法可讓您瀏覽 XML 資料,以及讀取節點的內容。 類別的屬性都會反映目前的節點,也就是讀取器所在的值。 ReadState 屬性值表示 XML 讀取器的目前狀態。 例如,屬性設定為 InitialXmlReader.Read 方法和 ClosedXmlReader.Close 方法。 XmlReader 也提供資料的一致性檢查和驗證對 DTD 或結構描述。

XmlReader使用提取模型擷取資料。 這種模型︰

  • 簡化自然、 上下程序的精緻化狀態管理。

  • 支援多個輸入資料流和圖層。

  • 可讓用戶端給予剖析器的字串直接寫入與因此會避免使用的其他字串複製到其中的緩衝區。

  • 支援選擇性處理。 用戶端可以略過項目,並處理這些感興趣的應用程式。 您也可以設定屬性事先以管理 XML 資料流 (例如正規化) 的處理方式。

本節內容:

建立 XML 讀取器
驗證 XML 資料
資料一致性
瀏覽節點
讀取 XML 項目
讀取 XML 屬性
讀取 XML 內容
轉換為 CLR 型別
非同步程式設計
安全性考量

使用 Create 方法來建立 XmlReader執行個體。

雖然.NET Framework 提供的具體實作 XmlReader 類別,例如 XmlTextReader, ,XmlNodeReader, ,而 XmlValidatingReader 類別,我們建議您只有在這些情況下,使用特製化的類別︰

  • 當您想要從 readan XML DOM 樹狀子目錄 XmlNode 物件,請使用 XmlNodeReader 類別。 (不過,這個類別不支援 DTD 或結構描述驗證)。

  • 如果您必須展開要求的實體,您不想將文字內容正規化,或者您不想預設傳回的屬性,請使用 XmlTextReader 類別。

若要指定您想要的 XML 讀取器上啟用的功能,請將傳遞 System.Xml.XmlReaderSettings 物件傳遞給 Create 方法。 您可以使用單一 System.Xml.XmlReaderSettings 物件來建立具有相同的功能,多個讀取器或修改 System.Xml.XmlReaderSettings物件來建立新的讀取器具有一組不同的功能。 您也可以將功能加入至現有讀取器中。

如果您不使用System.Xml.XmlReaderSettings物件時,會使用預設設定。 請參閱 Create 參考頁面的詳細資料。

XmlReader 擲回 XmlException xml 剖析錯誤。 在擲回例外狀況之後,讀取器的狀態不是可預測的。 例如,報告的節點型別可能不同於目前節點的實際節點型別。 使用 ReadState 屬性檢查讀取器是否處於錯誤狀態。

若要定義 XML 文件和項目關聯性、 資料類型及內容條件約束的結構,您可以使用文件類型定義 (DTD) 或 XML 結構描述定義語言 (XSD) 結構描述。 XML 文件會被視為正確它是否符合所定義的所有句法要求 W3C XML 1.0 Recommendation 如果它的格式正確,而且符合其 DTD 或結構描述所定義的條件約束,則會視為有效。 (請參閱 W3C XML Schema Part 1: StructuresW3C XML Schema Part 2: Datatypes建議。) 因此,雖然所有有效 XML 文件的格式都正確,但是並非所有格式正確的 XML 文件都有效。

您可以驗證 DTD 中,內嵌 XSD 結構描述,對資料或 XSD 結構描述儲存在 XmlSchemaSet 物件 (快取),將說明這些情況在 Create 參考頁面。 XmlReader 不支援 XML 資料精簡 (XDR) 結構描述驗證。

您可以使用下列設定上 XmlReaderSettings 類別,以指定哪一種驗證,如果有的話,XmlReader 執行個體可支援。

使用此 XmlReaderSettings 成員

若要指定

DtdProcessing 屬性

是否允許 DTD 處理。 預設不允許 DTD 處理。

ValidationType 屬性

讀取器是否應驗證資料,以及要執行 (DTD 或結構描述) 的驗證型別。 預設不進行資料驗證。

ValidationEventHandler 事件

事件處理常式以接收驗證事件的相關資訊。 如果未提供事件處理常式,會在第一次發生驗證錯誤時擲回 XmlException

ValidationFlags 屬性

額外的驗證選項,透過 XmlSchemaValidationFlags 列舉成員︰

  • AllowXmlAttributes-允許 XML 屬性 (xml:*) 即使在結構描述中有未定義的執行個體文件中。 根據其資料類型來驗證屬性。請參閱 XmlSchemaValidationFlags 設定在特定案例中使用的參考頁面。 (預設為停用。)

  • ProcessIdentityConstraints -處理識別條件約束 (xs:ID, ,xs:IDREF, ,xs:key, ,xs:keyref, ,xs:unique) 在驗證期間發生。 (依預設啟用)。

  • ProcessSchemaLocation -處理所指定的結構描述 xsi:schemaLocationxsi:noNamespaceSchemaLocation 屬性。 (依預設啟用)。

  • ProcessInlineSchema-處理驗證期間的內嵌 XML 結構描述。 (預設為停用。)

  • ReportValidationWarnings-如果發生驗證警告報告事件。 在沒有可以用於驗證特定項目或屬性的 DTD 或 XML 結構描述時,通常會發出警告。 會使用 ValidationEventHandler 來進行通知。 (預設為停用。)

Schemas

用來驗證的 XmlSchemaSet

XmlResolver 屬性

XmlResolver來解析和存取外部資源。 這可包括外部實體,例如 DTD 和結構描述,以及任何 xs:includexs:import XML 結構描述中所包含的項目。 如果您未指定 XmlResolver, 、 XmlReader 會使用預設 XmlUrlResolver 不具使用者認證。

所建立的 XML 讀取器 Create methodmeet 下列預設相容性需求︰

  • 新行和屬性值會根據 W3C 正規化 XML 1.0 Recommendation

  • 所有實體會自動都展開。

  • 即使不會驗證讀取器,永遠會加入預設文件類型定義中宣告的屬性。

  • 允許的 XML 前置詞對應至正確的 XML 命名空間 URI 宣告。

  • 在單一標記法名稱 NotationType 屬性宣告和NmTokens 在單一 Enumeration declarationare 相異的屬性。

使用這些 XmlReaderSettings 屬性,以指定的一致性類型會檢查您想要啟用︰

使用此 XmlReaderSettings 屬性

預設

CheckCharacters 屬性

啟用或停用檢查下列項目︰

當這個屬性設定為 true (預設)、 XmlException 擲回例外狀況是 XML 檔案包含不合法的字元或無效的 XML 名稱 (例如,項目名稱的數字開頭)。

字元,且名稱檢查已啟用。

設定 CheckCharactersfalse 會關閉字元檢查字元實體參考。 如果讀取器正在處理文字資料時,它會始終檢查 XML 名稱是否有效,不論這個設定為何。

System_CAPS_note注意

存在 DTD 時,XML 1.0 版建議事項會要求文件層級的一致性。 因此,如果讀取器設定成支援 ConformanceLevel.Fragment, ,但 XML 資料包含文件類型定義 (DTD), XmlException 就會擲回。

ConformanceLevel 屬性

選擇強制執行的一致性層級︰

如果資料不一致, XmlException 擲回例外狀況。

Document

目前節點是 XML 讀取器目前定位所在的 XML 節點。 所有 XmlReader方法會執行與這個節點及其所有相關的作業 XmlReader屬性會反映目前節點的值。

下列方法讓您輕鬆地瀏覽節點及剖析資料。

使用此 XmlReaderSettings 方法

Read

讀取的第一個節點,並透過資料流的一個節點移動一次。 這類呼叫通常會執行內 while 迴圈。

使用 NodeType 屬性來取得目前節點的類型 (例如屬性、 註解、 項目,等等)。

Skip

略過目前節點的子節點,並移至下一個節點。

MoveToContentMoveToContentAsync

略過非內容節點,並移至下一個內容節點或檔案的結尾。

非內容節點包括 ProcessingInstruction, ,DocumentType, ,Comment, ,Whitespace, ,和 SignificantWhitespace

內容節點包括非泛空白字元文字、 CDATA, ,EntityReference , ,和EndEntity

ReadSubtree

讀取項目和其所有子系,並傳回新的 XmlReader 執行個體設定為 ReadState.Initial

這個方法可用來建立 XML 項目; 周圍的界限例如,如果您想要將資料傳遞至另一個元件進行處理,而且您想要限制資料中有多少元件可以存取。

請參閱 XmlReader.Read 參考頁面的瀏覽一次的文字資料流的一個節點,並顯示每個節點類型的範例。

下列各節描述讀取特定類型的資料,例如元素、 屬性的方式,並輸入資料。

下表列出的方法和屬性, XmlReader 類別提供用於處理項目。XmlReader 定位於項目上後,節點屬性 (如 Name) 就會反映項目值。 除了下面說明的成員之外,還可以使用 XmlReader 類別的任意一般方法及屬性來處理項目。 例如,您可以使用 ReadInnerXml 方法讀取項目的內容。

System_CAPS_note注意

請參閱第 3.1 節 W3C XML 1.0 Recommendation 定義的開始標記、 結束標記與空項目標記。

使用此 XmlReader 成員

IsStartElement 方法

檢查目前節點為開始標記或空白項目標記。

ReadStartElement 方法

檢查目前節點是項目,並使讀取器前進至下一個節點 (呼叫 IsStartElement 後面 Read)。

ReadEndElement 方法

檢查目前節點為結尾標記,並使讀取器前進至下一個節點。

ReadElementString 方法

讀取純文字的項目。

ReadToDescendant 方法

XML 讀取器前移至下一個具有指定的名稱的下階 (子系) 項目。

ReadToNextSibling 方法

將 XML 讀取器前移至具有指定的名稱的下一個同層級項目。

IsEmptyElement 屬性

檢查目前的項目是否具有結尾項目標記。 例如:

讀取項目的文字內容的範例,請參閱 ReadString 方法。 下列範例會使用的處理項目 while 迴圈。

while (reader.Read()) {
  if (reader.IsStartElement()) {
    if (reader.IsEmptyElement)
      Console.WriteLine("<{0}/>", reader.Name);
    else {
      Console.Write("<{0}> ", reader.Name);
      reader.Read(); // Read the start tag.
      if (reader.IsStartElement())  // Handle nested elements.
        Console.Write("\r\n<{0}>", reader.Name);
      Console.WriteLine(reader.ReadString());  //Read the text content of the element.
    }
  } 
} 

XML 屬性最常見於項目,但他們也允許在 XML 宣告與文件型別節點。

當定位於項目節點, MoveToAttribute 方法可讓您瀏覽屬性清單的項目。 請注意,之後 MoveToAttribute 已呼叫節點屬性例如 Name, ,NamespaceURI, ,和 Prefix 反映該屬性的屬性、 不包含的項目屬性的屬性所屬。

XmlReader 類別會提供這些方法和屬性來讀取和處理項目的屬性。

使用此 XmlReader 成員

HasAttributes 屬性

檢查目前節點是否具有任何屬性。

AttributeCount 屬性

取得目前的項目屬性的數目。

MoveToFirstAttribute 方法

移至項目中的第一個屬性。

MoveToNextAttribute 方法

移至下一個屬性項目中。

MoveToAttribute 方法

移至指定的屬性。

GetAttribute 方法或 Item 屬性

取得指定之屬性的值。

IsDefault 屬性

檢查目前節點是否是產生自 DTD 或結構描述中定義的預設值的屬性。

MoveToElement 方法

移至擁有目前屬性的項目。 使用此方法傳回的項目後瀏覽它的屬性。

ReadAttributeValue 方法

屬性值剖析成一或多個 Text, ,EntityReference, ,或 EndEntity節點。

任何一般 XmlReader 方法和屬性都可用於處理屬性 (Attribute)。 例如,將 XmlReader 置於屬性 (Attribute) 上之後,NameValue 屬性會反映屬性 (Attribute) 的值。 您還可使用任何內容 Read 方法,以取得屬性的值。

這個範例會使用 AttributeCount 來瀏覽項目上的所有屬性的屬性。

// Display all attributes.
if (reader.HasAttributes) {
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  for (int i = 0; i < reader.AttributeCount; i++) {
    Console.WriteLine("  {0}", reader[i]);
  }
  // Move the reader back to the element node.
  reader.MoveToElement(); 
}

這個範例會使用 MoveToNextAttribute 方法中的 while 迴圈來瀏覽屬性。

if (reader.HasAttributes) {
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  while (reader.MoveToNextAttribute()) {
    Console.WriteLine(" {0}={1}", reader.Name, reader.Value);
  }
  // Move the reader back to the element node.
  reader.MoveToElement();
}

讀取 XML 宣告節點上的屬性

當 XML 讀取器置於 XML 宣告節點 Value 屬性會傳回版本、 獨立及編碼資訊以單一字串。 XmlReader 所建立的物件 Create 方法, XmlTextReader 類別,而 XmlValidatingReader類別公開版本、 獨立及編碼項目做為屬性。

讀取文件類型節點上的屬性

當 XML 讀取器置於文件類型節點 GetAttribute 方法和 Item 屬性可以用來傳回 SYSTEM 及 PUBLIC 常值的值。 例如,呼叫 reader.GetAttribute("PUBLIC") 會傳回 PUBLIC 值。

讀取處理指示節點的屬性

XmlReader 置於處理指示節點時,Value 屬性會傳回全部文字內容。 處理指示節點中的項目不被視為屬性。 無法讀取具有 GetAttributeMoveToAttribute 方法。

XMLReader 類別包括下列成員,可從 XML 檔案讀取內容,並將內容傳回為字串值。 (若要傳回的 CLR 型別,請參閱 下一節。)

使用此 XmlReader 成員

Value 屬性

取得目前節點的文字內容。 傳回的值取決於節點類型。請參閱 Value 參考頁面的詳細資料。

ReadString 方法

取得字串形式的項目或文字節點的內容。 這個方法會停止的處理指示與註解。

如需這個方法會如何處理特定節點類型的詳細資訊,請參閱 ReadString 參考頁面。

ReadInnerXmlReadInnerXmlAsync 方法

取得目前的節點,包括標記,但不包括開始和結束標記的所有內容。 例如︰

<node>this<child id="123"/></node>

ReadInnerXml 會傳回︰

this<child id="123"/>

ReadOuterXmlReadOuterXmlAsync 方法

取得目前節點及其子系,包括標記和開始/結束標記的所有內容。 例如︰

<node>this<child id="123"/></node>

ReadOuterXml 會傳回︰

<node>this<child id="123"/></node>

您可以使用的成員 XmlReader 類別 (列於下表) 來讀取 XML 資料和傳回值,做為通用語言執行階段 (CLR) 型別,而不是字串。 這些成員可讓您取得值,而不必手動剖析或將字串值轉換為最適合您的程式碼撰寫工作的表示法。

  • ReadElementContentAs 只有項目節點型別上呼叫方法。 這些方法無法用於包含項目子系或混合內容的項目。 呼叫後,XmlReader 物件會讀取開始標記、讀取項目內容,然後移動到超過結尾項目標記以後的部分。 處理指示及註解會略過,並且實體會展開。

  • ReadContentAs方法讀取的文字內容,讀取器目前的位置,以及如果沒有任何結構描述或資料型別與其相關聯,資訊的 XML 資料轉換的文字內容為要求的傳回型別。 文字、泛空白字元、顯著泛空白字元及 CDATA 區段都是串連的。 註解和處理指示會略過,並會自動解析實體參考。

XmlReader 類別會使用所定義的規則 W3C XML Schema Part 2: Datatypes建議。

使用此 XmlReader方法

傳回這個 CLR 類型

ReadContentAsBooleanReadElementContentAsBoolean

Boolean

ReadContentAsDateTimeReadElementContentAsDateTime

DateTime

ReadContentAsDoubleReadElementContentAsDouble

Double

ReadContentAsLongReadElementContentAsLong

Int64

ReadContentAsIntReadElementContentAsInt

Int32

ReadContentAsStringReadElementContentAsString

String

ReadContentAsReadElementContentAs

您使用指定的型別 returnType 參數

ReadContentAsObjectReadElementContentAsObject

最適當的型別,必須按照 XmlReader.ValueType 屬性。 請參閱 System.Xml 類別中的型別支援 對應資訊。

如果項目無法輕易地轉換成 CLR 型別因為其格式,您可以使用結構描述對應來確保轉換成功。 下列範例將使用.xsd 檔案 hire-date 項目 xs:date 類型,然後使用 ReadElementContentAsDateTime 方法來傳回項目做為 DateTime 物件。

輸入 (hireDate.xml):

<employee xmlns="urn:empl-hire">
    <ID>12365</ID>
    <hire-date>2003-01-08</hire-date>
    <title>Accountant</title>
</employee>

結構描述 (hireDate.xsd):

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:empl-hire" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="employee">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ID" type="xs:unsignedShort" />
        <xs:element name="hire-date" type="xs:date" />
        <xs:element name="title" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

程式碼︰

// Create a validating XmlReader object. The schema 
// provides the necessary type information.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add("urn:empl-hire", "hireDate.xsd");
using (XmlReader reader = XmlReader.Create("hireDate.xml", settings)) {

  // Move to the hire-date element.
  reader.MoveToContent();
  reader.ReadToDescendant("hire-date");

  // Return the hire-date as a DateTime object.
  DateTime hireDate = reader.ReadElementContentAsDateTime();
  Console.WriteLine("Six Month Review Date: {0}", hireDate.AddMonths(6));
}

輸出:

Six Month Review Date:  7/8/2003 12:00:00 AM

大部分的 XmlReader 方法有非同步"Async"結尾的方法名稱的對應項目。 例如,非同步相當於 ReadContentAsObjectReadContentAsObjectAsync

下列方法可以搭配非同步方法呼叫︰

下列章節說明非同步方法沒有非同步對應項目使用方式。

ReadStartElement 方法

public static async Task ReadStartElementAsync(this XmlReader reader, string localname, string ns)
{
    if (await reader.MoveToContentAsync() != XmlNodeType.Element)
    {
        throw new InvalidOperationException(reader.NodeType.ToString() + " is an invalid XmlNodeType");
    }
    if ((reader.LocalName == localname) && (reader.NamespaceURI == ns))
    {
        await reader.ReadAsync();
    }
    else
    {
        throw new InvalidOperationException("localName or namespace doesn’t match");
    }
}

ReadEndElement 方法

public static async Task ReadEndElementAsync(this XmlReader reader)
{
    if (await reader.MoveToContentAsync() != XmlNodeType.EndElement)
    {
        throw new InvalidOperationException();
    }
    await reader.ReadAsync();
}

ReadToNextSibling 方法

public static async Task<bool> ReadToNextSiblingAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find the next sibling
    XmlNodeType nt;
    do
    {
        await reader.SkipAsync();
        if (reader.ReadState != ReadState.Interactive)
            break;
        nt = reader.NodeType;
        if (nt == XmlNodeType.Element &&
             ((object)localName == (object)reader.LocalName) &&
             ((object)namespaceURI ==(object)reader.NamespaceURI))
        {
            return true;
        }
    } while (nt != XmlNodeType.EndElement && !reader.EOF);

    return false;
}

ReadToFollowing 方法

public static async Task<bool> ReadToFollowingAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find element with that name
    while (await reader.ReadAsync())
    {
        if (reader.NodeType == XmlNodeType.Element && ((object)localName == (object)reader.LocalName) && ((object)namespaceURI == (object)reader.NamespaceURI))
        {
            return true;
        }
    }
    return false;
}

ReadToDescendant 方法

public static async Task<bool> ReadToDescendantAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }
    // save the element or root depth
    int parentDepth = reader.Depth;
    if (reader.NodeType != XmlNodeType.Element)
    {
        // adjust the depth if we are on root node
        if (reader.ReadState == ReadState.Initial)
        {
            parentDepth--;
        }
        else
        {
            return false;
        }
    }
    else if (reader.IsEmptyElement)
    {
        return false;
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find the descendant
    while (await reader.ReadAsync() && reader.Depth > parentDepth)
    {
        if (reader.NodeType == XmlNodeType.Element && ((object)localName == (object)reader.LocalName) && ((object)namespaceURI == (object)reader.NamespaceURI))
        {
            return true;
        }
    }
    return false;
}

使用時,請考慮下列 XmlReader 類別︰

  • 從擲回的例外狀況 XmlReader 路徑資訊,您可能不想反昇至您的應用程式公開。 您的應用程式必須捕捉例外狀況並予以適當處理。

  • 請勿啟用 DTD 處理,如果您擔心阻絕服務問題,或如果您正在處理不受信任來源。 預設為停用 DTD 處理 XmlReader 所建立的物件 Create 方法。

    如果已啟用 DTD 處理,則可使用 XmlSecureResolver 限制 XmlReader 可存取的資源。 您還可以設計您的應用程式,讓 XML 處理具有記憶體和時間限制。 例如,您可以在 ASP.NET 應用程式中設定逾時限制。

  • XML 資料可以包括外部資源的參考,如結構描述檔案。 根據預設,使用解析外部資源 XmlUrlResolver 不具使用者認證的物件。 您可以透過執行下列其中一項作業,進一步保護它:

  • ProcessInlineSchemaProcessSchemaLocation 驗證旗標 XmlReaderSettings 物件不預設設定。 在處理來自不受信任來源的 XML 資料時,這有助於保護 XmlReader,防止其遭受以結構描述為基礎的攻擊。 當設定這些旗標時,XmlResolver 物件的 XmlReaderSettings 可用於解析在 XmlReader 的執行個體文件中發現的結構描述位置。 如果 XmlResolver 屬性設定為 null, ,結構描述位置不是解決即使 ProcessInlineSchemaProcessSchemaLocation 設定驗證旗標。

    驗證期間加入的結構描述會加入新型別,並可變更要驗證之物件的驗證結果。 因此,外部結構描述應僅從受信任的來源解析。

    我們建議您停用 ProcessIdentityConstraints 旗標不受信任、 大型 XML 文件中的高可用性的情況下,針對具有識別條件約束上的大型文件一部分的結構描述進行驗證時。 預設會啟用這個旗標。

  • XML 資料可以包含需要相當長時間來處理的大量屬性、命名空間宣告、巢狀項目等。 若要限制傳送至輸入大小 XmlReader, ,您可以︰

  • ReadValueChunk 方法可以用來處理大量資料流的資料。 此方法每次會讀取較少數量的字元,而不是為整個值配置單一字串。

  • 在讀取具有大量唯一本機名稱、 命名空間或前置詞的 XML 文件時,會發生問題。 如果您使用的類別,衍生自 XmlReader, ,而且您呼叫 LocalName, ,Prefix, ,或 NamespaceURI 每個項目的屬性,傳回的字串新增至 NameTable 所持有的集合 NameTable 永遠不會減少大小,建立字串控制代碼的虛擬記憶體遺漏。 這一個因應措施是衍生自 NameTable 類別並強制執行的最大大小配額。 (沒有任何方法,以避免使用 NameTable, ,或切換 NameTable 配額已滿時)。 另一個因應措施是避免使用提到的屬性,而是使用 MoveToAttribute 方法 IsStartElement 方法在可能的情況下,這些方法不傳回的字串,進而避免造成問題的量 NameTable 集合。

  • XmlReaderSettings 物件可以包含機密資訊 (如使用者認證)。 不受信任的元件可能會使用 XmlReaderSettings 物件及其使用者認證,建立 XmlReader 物件來讀取資料。 快取時請小心 XmlReaderSettings 物件,或傳遞時 XmlReaderSettings 物件到另一個元件。

  • 請不要接受來自不受信任來源的支援元件,如 NameTableXmlNamespaceManagerXmlResolver 物件。

下列程式碼範例示範如何使用非同步 APIto 剖析 XML。

async Task TestReader(System.IO.Stream stream)
{
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Async = true;

    using (XmlReader reader = XmlReader.Create(stream, settings))
    {
        while (await reader.ReadAsync())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine("Start Element {0}", reader.Name);
                    break;
                case XmlNodeType.Text:
                    Console.WriteLine("Text Node: {0}",
                             await reader.GetValueAsync());
                    break;
                case XmlNodeType.EndElement:
                    Console.WriteLine("End Element {0}", reader.Name);
                    break;
                default:
                    Console.WriteLine("Other node {0} with value {1}",
                                    reader.NodeType, reader.Value);
                    break;
            }
        }
    }
}

通用 Windows 平台
自 8 起供應
.NET Framework
自 1.1 起供應
可攜式類別庫
提供支援︰ 可攜式 .NET 平台
Silverlight
自 2.0 起供應
Windows Phone Silverlight
自 7.0 起供應
Windows Phone
自 8.1 起供應

此類型的任何 public static (在 Visual Basic 中 共用 在 Visual Basic 中) 成員皆為安全執行緒。不保證任何執行個體成員為安全執行緒。

回到頁首
顯示: