System.Xml 命名空間

提供處理 XML 的標準架構支援。

類別

NameTable

實作單一執行緒的 XmlNameTable

UniqueId

GUID 的最佳化唯一識別項。

XmlAttribute

代表屬性。 該屬性的有效和預設值會在文件類型定義 (DTD) 或結構描述中定義。

XmlAttributeCollection

代表可用名稱或索引存取的屬性集合。

XmlBinaryReaderSession

啟用以動態方式來管理最佳化的字串。

XmlBinaryWriterSession

允許使用動態字典來壓縮出現在訊息中的常見字串和維護狀態。

XmlCDataSection

表示 CDATA 區段。

XmlCharacterData

提供許多類別使用的文字操作方法。

XmlComment

代表 XML 註解的內容。

XmlConvert

編碼和解碼 XML 名稱,並且提供在 Common Language Runtime 類型和 XML 結構描述定義語言 (XSD) 類型之間轉換的方法。 轉換資料類型時,傳回的值與地區設定無關。

XmlDataDocument

允許透過關聯式 DataSet 存放、擷取及管理結構化資料。

XmlDeclaration

代表 XML 宣告節點 <?xml version='1.0'...?>。

XmlDictionary

實作可用來最佳化 Windows Communication Foundation (WCF) 之 XML 讀取器/寫入器實作的字典。

XmlDictionaryReader

表示 abstract 類別,這是 Windows Communication Foundation (WCF) 為了要執行序列化和還原序列化而衍生自 XmlReader 的類別。

XmlDictionaryReaderQuotas

包含 XmlDictionaryReaders 的可設定配額值。

XmlDictionaryString

表示儲存在 XmlDictionary 中的項目。

XmlDictionaryWriter

表示抽象類別,這是 Windows Communication Foundation (WCF) 為了要執行序列化和還原序列化而衍生自 XmlWriter 的類別。

XmlDocument

表示 XML 文件。 您可以於文件中使用這個類別來載入、驗證、編輯、加入和置放 XML。

XmlDocumentFragment

代表適用於樹狀插入作業的輕量型物件。

XmlDocumentType

表示文件類型宣告。

XmlDocumentXPathExtensions

針對文件導覽為 XmlDocumentXmlNode 提供擴充方法。

XmlElement

代表項目。

XmlEntity

代表實體宣告,例如 <!ENTITY... >。

XmlEntityReference

表示實體參考節點。

XmlException

傳回有關上次例外狀況的詳細資訊。

XmlImplementation

定義一組 XmlDocument 物件的內容。

XmlLinkedNode

取得這個節點的前置或後置節點。

XmlNamedNodeMap

代表可用名稱或索引存取的節點集合。

XmlNamespaceManager

解析、加入並移除集合的命名空間,並且為這些命名空間提供範圍管理。

XmlNameTable

原子化字串物件的資料表。

XmlNode

表示 XML 文件中的單一節點。

XmlNodeChangedEventArgs

提供 NodeChangedNodeChangingNodeInsertedNodeInsertingNodeRemovedNodeRemoving 事件的資料。

XmlNodeList

代表已排序的節點集合。

XmlNodeReader

表示讀取器,其提供對 XmlNode 中 XML 資料的快速且非快取順向存取。

XmlNotation

代表標記法宣告,例如 <!NOTATION... >。

XmlParserContext

提供 XmlReader 所需的所有內容資訊以剖析 XML 片段。

XmlProcessingInstruction

表示處理指示,其中 XML 定義將處理器特定資訊保存在文件的文字中。

XmlQualifiedName

代表 XML 限定名稱。

XmlReader

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

XmlReaderSettings

指定要在由 XmlReader 方法建立的 Create 物件上支援的一組功能。

XmlResolver

解析由統一資源識別項 (URI) 所命名的外部 XML 資源。

XmlSecureResolver

以包裝 XmlResolver 物件,並限制基礎 XmlResolver 所能存取的資源,來協助保護其他 XmlResolver 實作的安全性。

XmlSignificantWhitespace

表示混合內容節點中標記間的空白區,或 xml:space= 'preserve' 範圍內的空白區。 這個也可以稱為顯著的空白。

XmlText

表示項目或屬性的文字內容。

XmlTextReader

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

從 .NET Framework 2.0 開始,建議您改用 XmlReader 類別。

XmlTextWriter

表示提供產生資料流或檔案的快速、非快取、順向方法的寫入器,這些資料流或檔案中包含符合 W3C Extensible Markup Language (XML) 1.0 與 XML Recommendation 中命名空間的 XML 資料。

從 .NET Framework 2.0 開始,建議您改用 XmlWriter 類別。

XmlUrlResolver

解析由統一資源識別項 (URI) 所命名的外部 XML 資源。

XmlValidatingReader

表示讀取器,其提供文件類型定義 (DTD)、XML-Data Reduced (XDR) 結構描述,以及 XML 結構描述定義語言 (XSD) 驗證。

這個類別已經過時。 從 .NET Framework 2.0 開始,我們建議使用 XmlReaderSettings 類別及 Create 方法,來建立驗證 XML 讀取器。

XmlWhitespace

表示項目內容中的空白。

XmlWriter

表示寫入器,其可提供快速、非快取的順向方法來產生含有 XML 資料之資料流或檔案。

XmlWriterSettings

指定要在由 XmlWriter 方法建立的 Create 物件上支援的一組功能。

XmlXapResolver

XmlXapResolver 類型是用來解析 Silverlight 應用程式 XAP 套件中的資源。

介面

IApplicationResourceStreamResolver

表示應用程式資源資料流解析程式。

IFragmentCapableXmlDictionaryWriter

包含在經由 XmlDictionaryWriter 實作之後即可用來處理 XML 片段的屬性和方法。

IHasXmlNode

讓類別從目前的內容或位置傳回 XmlNode

IStreamProvider

表示可由類別提供資料流實作的介面。

IXmlBinaryReaderInitializer

提供用來重新初始化二進位讀取器的方法,以便讀取新文件。

IXmlBinaryWriterInitializer

指定衍生自此介面之 XML 二進位寫入器的實作需求。

IXmlDictionary

interface,定義 Xml 字典必須實作供 XmlDictionaryReaderXmlDictionaryWriter 實作 (Implementation) 使用的合約。

IXmlLineInfo

提供讓類別能夠傳回行和位置資訊的介面。

IXmlMtomReaderInitializer

指定衍生自此介面之 XML MTOM 讀取器的實作需求。

IXmlMtomWriterInitializer

在經過 MTOM 寫入器實作之後,這個介面就可以確保 MTOM 寫入器的初始化。

IXmlNamespaceResolver

提供對一組前置詞和命名空間 (Namespace) 對應的唯讀存取。

IXmlTextReaderInitializer

指定衍生自此介面之 XML 文字讀取器的實作需求。

IXmlTextWriterInitializer

指定衍生自此介面之 XML 文字寫入器的實作需求。

列舉

ConformanceLevel

指定 XmlReaderXmlWriter 物件所執行的輸入或輸出檢查數量。

DtdProcessing

指定處理 DTD 的選項。 DtdProcessing 列舉型別是由 XmlReaderSettings 類別所使用。

EntityHandling

指定 XmlTextReaderXmlValidatingReader 如何處理實體 (Entity)。

Formatting

指定 XmlTextWriter 的格式選項。

NamespaceHandling

指定是否要移除 XmlWriter 中的重複命名空間宣告。

NewLineHandling

指定如何處理分行符號。

ReadState

指定讀取器 (Reader) 的狀態。

ValidationType

指定要執行的驗證類型。

WhitespaceHandling

指定如何處理泛空白字元 (White Space)。

WriteState

指定 XmlWriter 的狀態。

XmlDateTimeSerializationMode

指定在字串和 DateTime 之間轉換時如何處理時間值。

XmlDictionaryReaderQuotaTypes

列舉 XmlDictionaryReaders 的可設定配額值。

XmlNamespaceScope

定義命名空間範圍。

XmlNodeChangedAction

指定節點變更的型別。

XmlNodeOrder

說明節點相較於第二個節點的文件順序。

XmlNodeType

指定節點類型。

XmlOutputMethod

指定用於序列化 XmlWriter 輸出的方法。

XmlSpace

取得目前的 xml:space 範圍。

XmlTokenizedType

表示字串的 XML 型別。 這可允許將字串當做特殊 XML 型別來讀取,例如 CDATA 區段型別。

委派

OnXmlDictionaryReaderClose

在關閉讀取器時用於回呼方法的 delegate

XmlNodeChangedEventHandler

表示處理 NodeChangedNodeChangingNodeInsertedNodeInsertingNodeRemovedNodeRemoving 事件的方法。

備註

支援的標準

System.Xml命名空間支援下列標準:

如需 XML 類別與 W3C 建議的差異,請參閱 W3C 規格的差異 一節。

.NET 也提供 XML 相關作業的其他命名空間。 如需清單、描述和連結,請參閱 System.Xml命名空間

以非同步方式處理 XML

System.Xml.XmlReaderSystem.Xml.XmlWriter 類別包含一些以非同步程式設計模型為基礎的非同步方法。 這些方法可由名稱結尾處的字串 「Async」 來識別。 使用這些方法,您可以撰寫類似同步程式碼的非同步程式碼,而且可以輕鬆地將現有的同步程式碼移轉至非同步程式碼。

  • 在有大量網路串流延遲的應用程式中使用非同步方法。 避免針對記憶體資料流程或本機檔案資料流程讀取/寫入作業使用非同步 API。 輸入資料流程 、 XmlTextReaderXmlTextWriter 也應該支援非同步作業。 否則,I/O 作業仍會封鎖執行緒。

  • 我們不建議混合同步和非同步函式呼叫,因為您可能忘記使用 await 關鍵字,或使用需要非同步 API。

  • 如果您不想使用非同步方法, XmlReaderSettings.Async 請勿將 或 XmlWriterSettings.Async 旗標設定為 true

  • 如果您忘記在呼叫非同步方法時指定 await 關鍵字,則結果不具決定性:您可能會收到預期的結果或例外狀況。

  • XmlReader當物件讀取大型文位元組點時,它可能只快取部分文字值並傳回文位元組點,因此擷取 XmlReader.Value 屬性可能會遭到 I/O 作業封鎖。 XmlReader.GetValueAsync使用 方法以非同步模式取得文字值,或使用 XmlReader.ReadValueChunkAsync 方法以區塊讀取大型文字區塊。

  • 當您使用 XmlWriter 物件時,請先呼叫 方法,再呼叫 XmlWriter.CloseXmlWriter.FlushAsync ,以避免封鎖 I/O 作業。

與 W3C 規格的差異

在涉及模型群組架構元件條件約束的兩種情況下, System.Xml 命名空間與 W3C 建議不同。

元素宣告中的一致性:

在某些情況下,使用替代群組時, System.Xml 實作不符合 W3C 規格之 模型群組架構元件的條件約束 一節中所述的「架構元件條件約束:元素宣告一致」。

例如,下列架構包含具有相同名稱但相同內容模型中不同類型的元素,以及使用替代群組。 這應該會造成錯誤,但是 System.Xml 會編譯和驗證該結構描述,而不會有錯誤。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

   <xs:element name="e1" type="t1"/>
   <xs:complexType name="t1"/>

   <xs:element name="e2" type="t2" substitutionGroup="e1"/>
      <xs:complexType name="t2">
         <xs:complexContent>
            <xs:extension base="t1">
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>

   <xs:complexType name="t3">
      <xs:sequence>
         <xs:element ref="e1"/>
         <xs:element name="e2" type="xs:int"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

在此結構描述中,型別 t3 包含項目順序。 因為替代之故,對序列中 e1 項目的參考可能會產生 e1 型別的 t1 項目或是 e2 型別的 t2 項目。 後者的案例會產生兩 e2 個元素的序列,其中一個是 型 t2 別,另一個則為 類型 xs:int

唯一物件屬性:

在下列情況下, System.Xml 實作不符合 W3C 規格之 模型群組架構元件的條件約束 一節中所述的「架構元件條件約束:唯一物件屬性」。

  • 群組中的其中一個項目參考其他項目。

  • 參考的項目是替代群組的標頭項目。

  • 替代群組包含與群組中其中一個專案同名的專案。

  • 參考替代群組前端專案且與替代群組專案同名的專案,不會固定在 minOccurs maxOccurs <) (元素的基數。

  • 參考替代群組的專案定義,在元素的定義前面加上與替代群組專案相同的名稱。

例如,在內容模型下方的結構描述是模稜兩可的,而且應該會造成編譯錯誤,但是 System.Xml 會編譯該結構描述,而不會有錯誤。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:element name="e1" type="xs:int"/>
  <xs:element name="e2" type="xs:int" substitutionGroup="e1"/>

  <xs:complexType name="t3">
    <xs:sequence>
      <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
      <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="e3" type="t3"/>
</xs:schema>

如果您嘗試驗證上述架構的下列 XML,驗證將會失敗,並出現下列訊息:「元素 'e3' 有不正確子項目 'e2'」,而且 XmlSchemaValidationException 將會擲回例外狀況。

<e3>
  <e2>1</e2>
  <e2>2</e2>
</e3>

若要解決此問題,您可以在 XSD 檔中交換元素宣告。 例如:

<xs:sequence>
  <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
  <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
</xs:sequence>

變成:

<xs:sequence>
  <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
  <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
</xs:sequence>

以下是相同問題的另一個範例:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
   <xs:element name="e1" type="xs:string"/>
   <xs:element name="e2" type="xs:string" substitutionGroup="e1"/>

   <xs:complexType name="t3">
      <xs:sequence>
         <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
         <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="e3" type="t3"/>
</xs:schema>

如果您嘗試針對上述架構驗證下列 XML,驗證將會失敗,但發生下列例外狀況:「未處理的例外狀況:System.Xml。Schema.XmlSchemaValidationException:'e2' el 元素無效 - 值 'abc' 根據其資料類型 'http://www.w3.org/2001/XMLSchema:int' 無效 - 字串 'abc' 不是有效的 Int32 值。」

<e3><e2>abc</e2></e3>

安全性考量

命名空間中的 System.Xml 類型和成員依賴 .NET 安全性系統。 下列各節將討論 XML 技術特有的安全性問題。

另請注意,當您使用 System.Xml 類型和成員時,如果 XML 包含具有潛在隱私權影響的資料,則需要以尊重使用者隱私權的方式實作您的應用程式。

外部存取

有幾個 XML 技術能夠在處理期間擷取其他文件。 例如,文件類型定義 (DTD) 可位於要剖析的文件中。 DTD 還可以存在於要剖析之文件所參考的外部文件中。 XML 結構描述定義語言 (XSD) 及 XSLT 技術還能夠包含其他檔案的資訊。 這些外部資源可能會有一些安全性考慮。 例如,您會想要確保應用程式只從信任的網站擷取檔案,而且其擷取的檔案不包含惡意資料。

類別 XmlUrlResolver 是用來載入 XML 檔,以及解析外部資源,例如實體、DTD 或架構,以及匯入或包含指示詞。

您可以覆寫這個類別,並指定要 XmlResolver 使用的物件。 如果您需要開啟不是由您控制或不受信任的資源,請使用 XmlSecureResolver 類別。 XmlSecureResolver 可包裝 XmlResolver,並可讓您限制基礎 XmlResolver 可存取的資源。

拒絕服務

下列案例較不易受阻斷服務的攻擊,因為 System.Xml 類別會提供保護免受此類攻擊的方法。

如果您擔心遭受阻斷服務攻擊,或正在不受信任的環境下工作,不建議您使用下列案例。

  • DTD 處理。

  • 結構描述處理。 這包括將不受信任的結構描述加入至結構描述集合、編譯不受信任的結構描述,以及使用不受信任的結構描述進行驗證。

  • XSLT 處理。

  • 剖析使用者提供之二進位 XML 資料的任意資料流。

  • DOM 作業,如查詢、編輯、在文件之間移動子樹狀目錄,以及儲存 DOM 物件。

如果您擔心拒絕服務問題,或處理不受信任的來源,請勿啟用 DTD 處理。 此方法建立的物件 XmlReader.Create 預設 XmlReader 會停用此功能。

注意

根據預設,XmlTextReader 允許 DTD 處理。 請使用 XmlTextReader.DtdProcessing 屬性停用此功能。

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

處理考慮

因為 XML 文件可以包含其他檔案的參考,所以很難判定需要多大的處理能力來剖析 XML 文件。 例如,XML 文件可以包含 DTD。 如果 DTD 包含巢狀實體或複雜的內容模型,則剖析文件會花費大量的時間。

當使用 XmlReader 時,您可以限制文件的大小,該文件可藉由設定 XmlReaderSettings.MaxCharactersInDocument 屬性來加以剖析。 您可以藉由設定 XmlReaderSettings.MaxCharactersFromEntities 屬性來限制從擴充實體所產生的字元數目。 如需設定這些屬性的範例,請參閱適當的參考主題。

XSD 及 XSLT 技術具有可影響處理效能的其他功能。 例如,評估很小的文件時,可能會建構需要大量時間進行處理的 XML 結構描述。 還可能將指令碼區塊嵌入 XSLT 樣式表中。 這兩種情況會對您的應用程式造成潛在的安全性威脅。

建立使用 XslCompiledTransform 類別的應用程式時,您應該注意下列專案及其含意:

  • 依預設會停用 XSLT 指令碼。 僅當需要指令碼支援且在完全受信任的環境中運作時,才應啟用 XSLT 指令碼。

  • 依預設會停用 XSLT document() 函式。 如果您啟用 document() 函式,則藉由傳遞 XmlSecureResolver 物件至 XslCompiledTransform.Transform 方法,限制可存取的資源。

  • 依預設會啟用擴充物件。 如果將包含擴充物件的 XsltArgumentList 物件傳遞給 XslCompiledTransform.Transform 方法,則會使用這些擴充物件。

  • XSLT 樣式表可以包含其他檔案及內嵌指令碼區塊的參考。 居心不良的使用者會利用這一點,藉由提供您資料或樣式表,使您因執行他們而導致系統持續處理,直到電腦資源不足,來進行攻擊。

  • 在混合信任環境中執行的 XSLT 應用程式可能會導致樣式表單詐騙。 例如,居心不良的使用者可載入含有害樣式表的物件,然後將其傳遞給另一使用者,該使用者隨後會呼叫 XslCompiledTransform.Transform 方法並執行轉換。

不啟用指令碼或 document() 函式 (除非樣式表來自信任的來源),不接受來自不受信任來源的 XslCompiledTransform 物件、XSLT 樣式表或 XML 來源資料,可減輕這些安全性問題。

例外狀況處理

較低層級元件擲回的例外狀況可能會揭露您不想向應用程式公開的路徑資訊。 您的應用程式必須攔截例外狀況,並適當地處理它們。

另請參閱