共用方式為


System.Xml 命名空間

提供基於標準的 XML 處理支援。

類別

名稱 Description
NameTable

實作單執行緒 XmlNameTable的 .

UniqueId

為 Guid 優化的唯一識別碼。

XmlAttribute

代表一種屬性。 屬性的有效與預設值定義於文件類型定義(DTD)或結構中。

XmlAttributeCollection

代表一組屬性,可透過名稱或索引存取。

XmlBinaryReaderSession

讓優化字串能以動態方式管理。

XmlBinaryWriterSession

允許使用動態字典壓縮訊息中常見的字串並維持狀態。

XmlCDataSection

代表一個 CDATA 區段。

XmlCharacterData

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

XmlComment

代表 XML 註解的內容。

XmlConvert

編碼與解碼 XML 名稱,並提供通用語言執行時類型與 XML 結構定義語言(XSD)類型之間的轉換方法。 在轉換資料型態時,回傳的值與地點無關。

XmlDataDocument

允許透過關聯 DataSet式儲存、檢索及操作結構化資料。

XmlDeclaration

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

XmlDictionary

實作一個字典,用於優化 Windows 通訊基金會(WCF)的 XML 讀寫實作。

XmlDictionaryReader

Windows 通訊基金會(WCFXmlReader)衍生出abstract一個用於序列化與反序列化的類別。

XmlDictionaryReaderQuotas

包含可設定的 XmlDictionaryReaders 配額值。

XmlDictionaryString

代表儲存在 XmlDictionary的 中。

XmlDictionaryWriter

代表 Windows 通訊基礎(WCF) XmlWriter 衍生出的抽象類別,用於序列化與反序列化。

XmlDocument

代表一份 XML 文件。 你可以用這個類別載入、驗證、編輯、新增並定位文件中的 XML。

XmlDocumentFragment

代表一個輕量級物件,可用於樹狀插入操作。

XmlDocumentType

代表文件類型的聲明。

XmlDocumentXPathExtensions

提供文件導覽的擴充方法XmlDocumentXmlNode

XmlElement

代表一個元素。

XmlEntity

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

XmlEntityReference

代表一個實體參考節點。

XmlException

回傳關於最後例外的詳細資訊。

XmlImplementation

定義一組 XmlDocument 物件的上下文。

XmlLinkedNode

取得緊接該節點前或後的節點。

XmlNamedNodeMap

代表一組可透過名稱或索引存取的節點。

XmlNamespaceManager

解析、新增及移除集合中的命名空間,並提供這些命名空間的範圍管理。

XmlNameTable

霧化串狀物件表。

XmlNode

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

XmlNodeChangedEventArgs

提供 、 NodeChangingNodeRemovingNodeRemovedNodeInsertingNodeInserted、 及 事件的資料。NodeChanged

XmlNodeList

表示節點的已排序集合。

XmlNodeReader

代表一種讀取器,提供快速且非快取的 XML 資料 XmlNode存取。

XmlNotation

代表一種記號宣告,例如 <!符號...... >

XmlParserContext

提供解析 XML 片段所需的 XmlReader 所有上下文資訊。

XmlProcessingInstruction

代表一種處理指令,XML 定義此指令以保留文件文本中處理器專屬的資訊。

XmlQualifiedName

代表 XML 限定名稱。

XmlReader

表示提供 XML 數據的快速、非快取、僅轉送存取的讀取器。

XmlReaderSettings

指定一組功能,以支援由方法建立CreateXmlReader物件。

XmlResolver

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

XmlSecureResolver

透過包裝XmlResolver物件並限制底層XmlResolver可存取的資源,有助於保護另一個實作XmlResolver

XmlSignificantWhitespace

表示混合內容節點標記間的空白,或 xml:space=「保留」範圍內的空白。 這也被稱為顯著的白色空白。

XmlText

代表元素或屬性的文字內容。

XmlTextReader

代表一種讀取器,提供快速、非快取、僅向前向存取的 XML 資料存取。

我們建議你改用這 XmlReader 門課。

XmlTextWriter

代表一種撰寫者,提供一種快速、非快取、僅前進的方式,產生包含符合 W3C 可擴充標記語言(XML)1.0 及 XML 命名空間建議的 XML 資料串流或檔案。

我們建議你改用這 XmlWriter 門課。

XmlUrlResolver

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

XmlValidatingReader

代表一個讀取器,提供文件類型定義(DTD)、XML-Data 簡化(XDR)架構,以及 XML 架構定義語言(XSD)驗證。

這個類別已經過時。 我們建議你使用該 XmlReaderSettings 類別和 Create 方法來建立一個驗證 XML 讀取器。

XmlWhitespace

代表元素內容中的空白。

XmlWriter

表示提供快速、非快取、順向方式的寫入器,以產生包含 XML 數據的數據流或檔案。

XmlWriterSettings

指定一組功能,以支援由方法建立CreateXmlWriter物件。

XmlXapResolver

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

介面

名稱 Description
IApplicationResourceStreamResolver

代表一個應用程式資源串流解析器。

IFragmentCapableXmlDictionaryWriter

包含屬性與方法,當由 實 XmlDictionaryWriter作時,允許處理 XML 片段。

IHasXmlNode

使類別能從當前上下文或位置回傳 。XmlNode

IStreamProvider

代表一種可由提供串流的類別實作的介面。

IXmlBinaryReaderInitializer

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

IXmlBinaryWriterInitializer

規定源自此介面的 XML 二進位寫入器實作需求。

IXmlDictionary

定義 interface 了 XML 字典必須實作的合約,才能被 XmlDictionaryReaderXmlDictionaryWriter 實作使用。

IXmlLineInfo

提供介面,使類別能回傳線路與位置資訊。

IXmlMtomReaderInitializer

規定源自此介面的 XML MTOM 讀取器的實作需求。

IXmlMtomWriterInitializer

當由 MTOM 寫入器實作時,此介面可確保 MTOM 寫入器的初始化。

IXmlNamespaceResolver

提供一組前綴與命名空間映射的唯讀存取。

IXmlTextReaderInitializer

規定源自此介面的 XML 文字閱讀器的實作需求。

IXmlTextWriterInitializer

規範源自此介面的 XML 文字編入器實作需求。

列舉

名稱 Description
ConformanceLevel

指定 XmlReaderXmlWriter 物件執行的輸入或輸出量。

DtdProcessing

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

EntityHandling

指定 XmlTextReaderXmlValidatingReader 如何處理實體。

Formatting

指定 XmlTextWriter的格式設定選項。

NamespaceHandling

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

NewLineHandling

指定如何處理換行符。

ReadState

指定讀取器的狀態。

ValidationType

指定要執行的驗證類型。

WhitespaceHandling

指定如何處理空格符。

WriteState

指定 XmlWriter的狀態。

XmlDateTimeSerializationMode

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

XmlDictionaryReaderQuotaTypes

列舉 XmlDictionaryReaders 的可設定配額值。

XmlNamespaceScope

定義命名空間範圍。

XmlNodeChangedAction

指定節點變更的類型。

XmlNodeOrder

描述節點與第二個節點相比的文件順序。

XmlNodeType

指定節點的類型。

XmlOutputMethod

指定用來串行化 XmlWriter 輸出的方法。

XmlSpace

指定目前的 xml:space 範圍。

XmlTokenizedType

表示字串的 XML 類型。 這可讓字串讀取為特定的 XML 類型,例如 CDATA 區段類型。

委派

名稱 Description
OnXmlDictionaryReaderClose

delegate 在關閉讀取器時,會用回撥方法。

XmlNodeChangedEventHandler

表示處理 NodeChangedNodeChangingNodeInsertedNodeInsertingNodeRemovedNodeRemoving 事件的方法。

備註

支援的標準

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

請參閱 「與 W3C 規範的差異 」章節,了解 XML 類別與 W3C 建議不同的兩個案例。

非同步處理 XML

System.Xml.XmlReaderSystem.Xml.XmlWriter類別包含多種基於非同步程式設計模型的非同步方法。 這些方法可透過名稱末尾的字串「Async」來辨識。 透過這些方法,你可以寫出與同步程式碼相似的非同步程式碼,也能輕鬆將現有的同步程式碼遷移到非同步程式碼。

  • 在網路串流延遲較大的應用程式中,使用非同步方法。 避免使用非同步 API 進行記憶體串流或本地檔案串流的讀寫操作。 輸入串流 XmlTextReader, , XmlTextWriter 也應該支援非同步操作。 否則,執行緒仍會被 I/O 操作阻擋。

  • 我們不建議將同步與非同步函式呼叫混用,因為你可能會忘記使用 await 關鍵字,或在需要非同步 API 的情況下使用同步 API。

  • 如果你不打算使用非同步方法,請不要將 XmlReaderSettings.Async OR XmlWriterSettings.Async 標記設為 。true

  • 如果你在呼叫非同步方法時忘記指定 await 關鍵字,結果將是非確定性的:你可能會得到預期的結果或例外。

  • XmlReader 物件讀取大型文字節點時,可能只快取部分文字值並回傳文字節點,因此取得該 XmlReader.Value 屬性可能會被輸入輸出(I/O)操作阻擋。 使用 XmlReader.GetValueAsync 非同步模式取得文字值的方法,或用該 XmlReader.ReadValueChunkAsync 方法分段讀取大型文字區塊。

  • 使用 XmlWriter 物件時,請先呼叫該 XmlWriter.FlushAsync 方法,避免 XmlWriter.Close 阻塞 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的參照可以是型別t1的元素e1,或是型別t2的元素e2。 後者會產生兩個 e2 元素的序列,其中一個為型別 t2 ,另一個為型別 xs:int

唯一粒子歸屬:

在以下條件下,實 System.Xml 作不符合「模式組件限制:唯一粒子歸屬」條件,該條件詳見 W3C 規範中「 模型群組結構元件限制」 章節。

  • 群中的一個元素會參考另一個元素。
  • 所參考的元素是替換群的中心元素。
  • 替換群包含一個與該群中元素同名的元素。
  • 參考替換群 head 元素與同名替換群元素的元素的基數並非固定(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 與上述架構對照,驗證會失敗,並有以下例外:「Unhandled Exception: System.Xml.Schema.XmlSchemaValidationException: 'e2' el element is invalid - '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 Schema 定義語言(XSD)與 XSLT 技術也具備包含其他檔案資訊的能力。 這些外部資源可能帶來一些安全疑慮。 例如,你要確保應用程式只從受信任的網站檢索檔案,且所檢索的檔案不含惡意資料。

XmlUrlResolver 類別用於載入 XML 文件,並解析外部資源如實體、DTD 或 schema,並匯入或包含指令。

你可以覆寫這個類別,並指定 XmlResolver 要使用的物件。 如果您需要開啟不控制的資源,或未受信任的資源,請使用 類別 XmlSecureResolverXmlSecureResolver包裝和 XmlResolver 和 允許你限制底層XmlResolver可存取的資源。

拒絕服務

以下情境被認為較不易受到阻斷服務攻擊,因為這些 System.Xml 類別提供了防範此類攻擊的防護手段。

如果您擔心阻斷服務攻擊,或是在不可信的環境中工作,以下情境不建議使用。

  • DTD 處理。

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

  • XSLT 處理。

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

  • DOM 操作如查詢、編輯、文件間子樹移動及儲存 DOM 物件。

如果您擔心拒絕服務問題或處理不可靠的來源,請勿啟用 DTD 處理。 在該XmlReader.Create方法所建立的物件上,預設XmlReader會關閉此功能。

備註

預設 XmlTextReader 允許 DTD 處理。 使用該 XmlTextReader.DtdProcessing 屬性來停用此功能。

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

處理考量

由於 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()函式,而且也不應接受來自不受信任來源的物件、XSLT 樣式表單或 XML 源數據,以減輕這些安全性問題。

例外狀況處理

低階元件拋出的例外可能會揭露你不希望暴露給應用程式的路徑資訊。 你的應用程式必須偵測異常並適當處理。

另請參閱