XmlReader/XmlWriter 類


  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

如果此節點不是內容節點,則讀取器向前跳至下一個內容節點或文件結尾。
它跳過以下類型的節點:ProcessingInstruction、DocumentType、Comment、Whitespace 或 SignificantWhitespace

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類的實例中設置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM