XmlReader用於讀取Xml文件,XmlWriter用於將數據寫到Xml文件。其實,在印象當中,XML很多的操作類都支持直接Save、Read也支持接受XmlReader與XmlWriter類的示例作為參數,但是為什么還要有這個兩類來專門用於讀寫XML文件呢?因為它們有強大的自定義格式功能;
一、XmlReader的使用
XmlReader類專門用於讀取Xml文件,最大的特點在於支持Settings。
屬性 | 說明 |
AttributeCount | 當在派生類中被重寫時,獲取當前節點上的屬性數 |
BaseURI | 當在派生類中被重寫時,獲取當前節點的基 URI |
CanReadBinaryContent | 獲取一個值,該值指示 XmlReader 是否實現二進制內容讀取方法 |
Depth | 獲取 XML 文檔中當前節點的深度 |
EOF | 獲取一個值,該值指示此讀取器是否定位在流的結尾 |
HasAttributes | 獲取一個值,該值指示當前節點是否有任何屬性 |
HasValue | 獲取一個值,該值指示當前節點是否可以具有 Value |
IsDefault | 獲取一個值,該值指示當前節點是否是從 DTD 或架構中定義的默認值生成的特性 |
IsEmptyElement | 獲取一個值,該值指示當前節點是否為空元素(例如 <MyElement/>) |
Item | 獲取具有指定索引的屬性的值,支持整形,字符串,LocalName 和 NamespaceURI作為參數 |
LocalName | 獲取當前節點的本地名稱 |
Name | 獲取當前節點的限定名 |
NamespaceURI | 獲取讀取器定位在其上的節點的命名空間 URI |
NameTable | 獲取與該實現關聯的 XmlNameTable |
NodeType | 獲取當前節點的類型 |
Prefix | 獲取與當前節點關聯的命名空間前綴 |
QuoteChar | 獲取用於括住特性節點值的引號字符 |
ReadState | 獲取讀取器的狀態 |
SchemaInfo | 獲取作為架構驗證結果分配給當前節點的架構信息 |
Settings | 獲取用於創建此 XmlReader 實例的 XmlReaderSettings 對象 |
Value | 獲取當前節點的文本值 |
ValueType | 獲取當前節點的公共語言運行時 (CLR) 類型 |
XmlLang | 獲取當前的 xml:lang 范圍 |
XmlSpace | 獲取當前的 xml:space 范圍 |
常用方法:
方法 | 說明 |
Close | 將 ReadState 更改為 Closed |
Create | 使用指定的參數類型創建一個新的 XmlReader 實例 |
Dispose | 釋放由 XmlReader 類的當前實例占用的所有資源 |
GetAttribute | 當在派生類中被重寫時,獲取具有指定索引的屬性的值 |
GetValueAsync | 異步獲取當前節點的值 |
IsName | 返回一個值,該值指示字符串參數是否是有效的 XML 名稱 |
IsNameToken | 返回一個值,該值指示該字符串參數是否是有效的 XML 名稱標記 |
IsStartElement | 調用 MoveToContent 並測試當前內容節點是否是開始標記或空元素標記 |
LookupNamespace | 在當前元素的范圍內解析命名空間前綴 |
MoveToAttribute | 移動到具有指定索引的屬性 |
MoveToContent | 如果此節點不是內容節點,則讀取器向前跳至下一個內容節點或文件結尾。 |
MoveToElement | 移動到包含當前屬性節點的元素 |
MoveToFirstAttribute | 移動到第一個屬性 |
MoveToNextAttribute | 移動到下一個屬性 |
Read | 從流中讀取下一個節點 |
ReadAttributeValue | 將屬性值解析為一個或多個 Text、EntityReference 或 EndEntity 節點 |
ReadContentAs | 將內容作為指定類型的對象讀取 |
ReadStartElement | 檢查當前節點是否為元素並將讀取器推進到下一個節點 |
ReadElementContentAs | 將元素內容作為請求類型讀取 |
ReadElementString | 讀取純文本元素 |
ReadEndElement | 檢查當前內容節點是否為結束標記並將讀取器推進到下一個節點 |
ReadInnerXml | 將所有內容(包括標記)當做字符串讀取 |
ReadOuterXml | 讀取表示該節點和所有它的子級的內容(包括標記) |
ReadString | 將元素或文本節點的內容當做字符串讀取 |
ReadSubtree | 此實例可用於讀取當前節點及其所有子節點 |
ReadToDescendant | 讓 XmlReader 前進到下一個具有指定限定名的子代元素 |
ReadToFollowing | 一直讀取,直到找到具有指定限定名的元素 |
ReadToNextSibling | 讓 XmlReader 前進到下一個具有指定限定名的同級元素 |
ReadValueChunk | 讀取嵌入在 XML 文檔中的大量文本流 |
ResolveEntity | 解析 EntityReference 節點的實體引用 |
Skip | 跳過當前節點的子級 |
示例:
class Program { static void Main(string[] args) { //<?xml version="1.0" encoding="utf-8"?> //<Persons> // <Person> // <Name>劉備</Name> // <Age>28</Age> // </Person> //</Persons> XmlReader reader = XmlReader.Create(@"D:\123.xml"); reader.ReadString(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "Name") { Console.WriteLine(reader.ReadElementString()); //劉備 Console.WriteLine(reader.HasAttributes); //false } } } Console.ReadKey(); } }
大多數方法和屬性的使用方法都和上面的例子相似,不在啰嗦。下面來說說,XmlReader的特色功能,自定義格式,其中最主要用到的是屬性Settings。
示例2:
static void Main(string[] args) { //<?xml version="1.0" encoding="utf-8"?> //<Persons> // <Person> // <!-- 這是一個牛人 --> // <Name>劉備</Name> // <Age>28</Age> // </Person> //</Persons> XmlReaderSettings RSetting = new XmlReaderSettings(); RSetting.IgnoreComments = false; //如果設置為true則忽略所有注釋 XmlReader reader = XmlReader.Create(@"D:\123.xml", RSetting); reader.ReadString(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Comment) { Console.WriteLine(reader.Value); //這是一個牛人 } } Console.ReadKey(); } }
二、XmlWriter的使用
常用屬性:
屬性 | 說明 |
Settings | 獲取用於創建此 XmlWriter 實例的 XmlWriterSettings 對象 |
WriteState | 當在派生類中被重寫時,獲取編寫器的狀態 |
XmlLang | 當在派生類中被重寫時,獲取當前的 xml:lang 范圍 |
XmlSpace | 當在派生類中被重寫時,獲取表示當前 xml:space 范圍的 XmlSpace |
常用方法:
方法 | 說明 |
Close | 當在派生類中被重寫時,關閉此流和基礎流 |
Create | 使用指定的流創建一個新的 XmlWriter 實例 |
Dispose | 釋放由 XmlWriter 類的當前實例占用的所有資源 |
Flush | 將緩沖區中的所有內容刷新到基礎流,並同時刷新基礎流 |
LookupPrefix | 返回在當前命名空間范圍中為該命名空間 URI 定義的最近的前綴 |
WriteAttributes | 寫出在 XmlReader 中當前位置找到的所有屬性 |
WriteAttributeString | 寫出具有指定的本地名稱和值的屬性 |
WriteBase64 | 將指定的二進制字節編碼為 Base64 並寫出結果文本 |
WriteBinHex | 將指定的二進制字節編碼為 BinHex 並寫出結果文本 |
WriteCData | 寫出包含指定文本的 <![CDATA[...]]> 塊 |
WriteCharEntity | 為指定的 Unicode 字符值強制生成字符實體 |
WriteChars | 以每次一個緩沖區的方式寫入文本 |
WriteComment | 寫出包含指定文本的注釋 <!--...--> |
WriteDocType | 寫出具有指定名稱和可選屬性的 DOCTYPE 聲明 |
WriteElementString | 編寫具有指定的本地名稱和值的元素 |
WriteEndAttribute | 關閉上一個 WriteStartAttribute 調用 |
WriteStartDocument | 編寫版本為"1.0"的 XML 聲明 |
WriteEndDocument | 關閉任何打開的元素或屬性並將編寫器重新設置為 Start 狀態 |
WriteStartElemen | 寫入指定的開始標記並將其與給定的命名空間和前綴關聯起來 |
WriteEndElement | 關閉一個元素並彈出相應的命名空間范圍 |
WriteEntityRef | 按 &name; 寫出實體引用 |
WriteFullEndElement | 關閉一個元素並彈出相應的命名空間范圍 |
WriteName | 寫出指定的名稱,確保它是符合 W3C XML 1.0 建議 |
WriteNmToken | 寫出指定的名稱,確保它是符合 W3C XML 1.0 建議 |
WriteNode | 將所有內容從讀取器復制到編寫器並將讀取器移動到下一個同級的 |
WriteProcessingInstruction | 寫出在名稱和文本之間帶有空格的處理指令 |
WriteQualifiedName | 寫出命名空間限定的名稱。 此方法查找位於給定命名空間范圍內的前綴 |
WriteRaw | 從字符串手動編寫原始標記 |
WriteStartAttribute | 用指定的本地名稱編寫屬性的起點 |
WriteString | 編寫給定的文本內容 |
WriteSurrogateCharEntity | 為代理項字符對生成並編寫代理項字符實體 |
WriteValue | 編寫一個參數中指定的類型的值 |
WriteWhitespace | 寫出給定的空白 |
示例:
static void Main(string[] args) { //<?xml version="1.0" encoding="utf-8" standalone="yes"?><Persons><Person><Name>劉備</Name><Age>28</Age></Person></Persons> using (FileStream fs = new FileStream(@"D:\123.xml",FileMode.Create,FileAccess.Write)) { using (XmlWriter xw = XmlWriter.Create(fs)) { //XML聲明 xw.WriteStartDocument(true); xw.WriteStartElement("Persons"); xw.WriteStartElement("Person"); xw.WriteStartElement("Name"); xw.WriteString("劉備"); xw.WriteEndElement(); xw.WriteStartElement("Age"); xw.WriteValue(28); xw.WriteEndElement(); xw.WriteEndElement(); xw.WriteEndElement(); xw.WriteEndDocument(); } } Console.ReadKey(); }
上面的注釋就是代碼所生成的文檔。
上面生成的XML有些問題,沒換行,沒法看。而且,如果我想去掉XML聲明又怎么搞?
示例2:
static void Main(string[] args) { //<Persons> // <Person> // <Name>劉備</Name> // <Age>28</Age> // </Person> //</Persons> XmlWriterSettings WSetting = new XmlWriterSettings(); //去掉XML聲明 WSetting.OmitXmlDeclaration = true; WSetting.Indent = true; using (FileStream fs = new FileStream(@"D:\123.xml",FileMode.Create,FileAccess.Write)) { using (XmlWriter xw = XmlWriter.Create(fs, WSetting)) { //XML聲明 xw.WriteStartElement("Persons"); xw.WriteStartElement("Person"); xw.WriteStartElement("Name"); xw.WriteString("劉備"); xw.WriteEndElement(); xw.WriteStartElement("Age"); xw.WriteValue(28); xw.WriteEndElement(); xw.WriteEndElement(); xw.WriteEndElement(); } } Console.ReadKey(); }
這樣生成的XML就又縮進又去掉命名空間了,更多的設置在XmlWriterSettings類的實例中設置。