Xml讀寫操作(XmlTextReader 類)
1.XML簡介
1)XML 和 HTML 的設計初衷
- XML 被設計用來傳輸和存儲數據
- HTML 被設計用來顯示數據
2)什么是 XML?
- XML 指可擴展標記語言(EXtensible Markup Language)
- XML 是一種標記語言,很類似 HTML
- XML 的設計宗旨是傳輸數據,而非顯示數據
- XML 標簽沒有被預定義。您需要自行定義標簽
- XML 被設計為具有自我描述性
- XML 是 W3C 的推薦標準
3)XML 與 HTML 的主要差異
- XML 不是 HTML 的替代
- XML 和 HTML 為不同的目的而設計:
- XML 被設計為傳輸和存儲數據,其焦點是數據的內容
- HTML 被設計用來顯示數據,其焦點是數據的外觀
- HTML 旨在顯示信息,而 XML 旨在傳輸信息
4)關于節點 (非常重要)
根據 DOM,XML 文檔中的每個成分都是一個節點。
- 整個文檔是一個文檔節點
- 每個 XML 標簽是一個元素節點
- 包含在 XML 元素中的文本是文本節點
- 每一個 XML 屬性是一個屬性節點
- 注釋屬于注釋節點

2.訪問XML文件的兩個基本模型
1)DOM模型:使用DOM的好處在于它允許編輯和更新XML文檔,可以隨機訪問文檔中的數據,可以使用XPath查詢,但是,DOM的缺點在于它需要一次性加載整個文檔到內存中,對于大型的文檔,這會造成資源問題。
2)流模型:流模型很好的解決了這個問題,因為它對XML文件的訪問采用的是流的概念,也就是說,任何時候在內存中只有當前節點,但它也有它的不足,它是只讀的,僅向前的,不能在文檔中執行向后導航操作。雖然是各有千秋,但我們也可以在程序中兩者并用實現優劣互補。
3.C#在System.XML 名稱空間中包含以下幾個用于XML的類
XMLTextReader------提供以快速、單向、無緩沖的方式存取XML數據。(單向意味著你只能從前往后讀取XML文件,而不能逆向讀取)
XMLValidatingReader------與XMLTextReader類一起使用,提供驗證DTD、XDR和XSD架構的能力。
XMLDocument------遵循W3C文檔對象模型規范的一級和二級標準,實現XML數據隨機的、有緩存的存取。一級水平包含了DOM的最基本的部分,而二級水平增加多種改進,包括增加了對名稱空間和級連狀圖表(CSS)的支持。
XMLTextWriter------生成遵循 W3C XML 1.0 規范的XML文件。
4. XMLTextReader 類簡介
C# XMLTextReader 這個類設計的目的就是從XML文件中快速的讀取數據,而對系統資源(主要包括內存和處理器時間)不做很高的要求。
如果是需要對 XML 進行多樣性的隨機訪問,編輯操作則使用 XMLDocument,該類具有極強的靈活性。
5.特性
1)單向只讀,無緩沖,且不可逆。
2)讀取完畢需要手動關閉流釋放資源。
XMLTextReader 類的方法和屬性
1.XMLTextReader 類的一些常用的屬性:
屬性 | 描述 |
---|---|
WhitespaceHandling WhitespaceHandling { get; set; } | 獲取或設置一個值,該值指定如何處理空白區域 |
string? BaseURI { get; } | 獲取當前節點的地址 |
string NamespaceURI { get; } | 獲取讀取器定位在的節點的命名空間 URI |
Encoding? Encoding { get; } | 獲取文檔的編碼 |
int Depth { get; } | 獲取XML文檔中當前節點的深度 |
int LineNumber { get; } | 獲取當前行號 |
int LinePosition { get; } | 獲取當前行位置 |
bool EOF { get; } | 判斷讀取器是否定位在流結尾 |
XmlNodeType NodeType { get; } | 獲取當前節點的類型 |
string Value { get; } | 獲取當前節點的文本值 |
bool IsEmptyElement { get; } | 判斷當前節點是否為空元素 |
bool Normalization { get; set; } | 判斷是否規范化空白區域和屬性值 |
string LocalName { get; } | 獲取當前節點的本地名稱 |
string Name { get; } | 獲取當前節點的限定名稱 |
string item[int]{ get; } | 獲取指定索引處屬性的值 |
string item[string, string]{ get; } | 獲取具有指定LocalName和NamespaceURI的屬性的值 |
string item[string]{ get; } | 獲取具有指定Name的屬性的值 |
bool HasAttributes { get; } | 判斷當前節點是否有任何屬性 |
int AttributeCount { get; } | 獲取當前節點上的屬性數目 |
string Prefix { get; } | 獲取與當前節點關聯的命名空間前綴 |
char QuoteChar { get; } | 獲取用于括起屬性節點的值的引號字符 |
ReadState ReadState { get; } | 獲取讀取器的狀態 |
XmlReaderSettings? Settings { get; } | 獲取用于創建此XmlReader實例的XmlReaderSettings對象 |
Type ValueType { get; } | 獲取當前節點的公共語言運行時類型 |
string XmlLang { get; } | 獲取當前 xml:lang 范圍 |
XmlSpace XmlSpace { get; } | 獲取當前 xml:space 范圍 |
bool HasValue { get; } | 判斷當前節點是否可以具有 String.Empty 以外的 Value |
bool Namespaces { get; set; } | 獲取或設置是否進行命名空間支持 |
bool CanReadBinaryContent { get; } | 判斷節點是否實現二進制內容讀取方法 |
bool CanReadValueChunk { get; } | 判斷節點是否實現 ReadValueChunk(Char[], Int32, Int32) 方法 |
bool CanResolveEntity { get; } | 判斷讀取器是否可以分析和解析實體 |
EntityHandling EntityHandling { get; set; } | 獲取或設置一個值,該值指定讀取器處理實體的方式 |
XmlNameTable NameTable { get; } | 獲取與此實現關聯的 XmlNameTable |
2.XMLTextReader 類的一些常用的方法:
方法 | 屬性 |
---|---|
void Close(); | 關閉流,并釋放資源 |
void Dispose(); | 釋放當前使用的所有資源 |
TextReader GetRemainder(); | 獲取當前節點外XML的剩余部分,返回TextReader |
bool Read(); | 從流中讀取下一個節點,調用一次就只會讀取一次 |
XmlNodeType MoveToContent(); | 跳過 非內容節點 至下一個 內容節點 |
bool IsStartElement(string name); | 跳過非內容節點,判斷當前節點是否為指定元素的開始節點 |
void ReadStartElement(); | 跳過Element節點至下一個節點 |
void ReadStartElement(string name); | 跳過 指定元素開始節點 至下一個節點 |
void ReadEndElement(); | 跳過EndElement節點至下一個節點 |
bool ReadToDescendant(string name); | 跳到第一個具有指定限定名的子代元素 |
bool ReadToFollowing(string name); | 一直讀取,直到找到所有具有指定限定名的元素 |
bool ReadToNextSibling(string name); | 一直讀取,前進到下一個具有指定限定名的同級元素 |
void ResetState(); | 將讀取器的狀態重置為 ReadState.Initial |
string GetAttribute(int i); | 獲取具有指定索引的屬性的值 |
string GetAttribute(string name); | 獲取具有指定屬性名稱的屬性值 |
IDictionary GetNamespacesInScope(XmlNamespaceScope scope); | 獲取一個集合,該集合包含當前在范圍內的所有命名空間 |
void MoveToAttribute(int i); | 移動到具有指定索引的屬性 |
bool MoveToAttribute(string name); | 移動到具有指定名稱的屬性 |
bool MoveToElement(); | 判斷指針是否移動到屬性節點 |
bool MoveToFirstAttribute(); | 移動到第一個屬性 |
bool MoveToNextAttribute(); | 移動到下一個屬性 |
bool ReadAttributeValue(); | 將屬性值分析為一個或多個 Text、EntityReference 或 EndEntity 節點 |
string ReadElementString(); | 讀取純文本元素 |
string ReadInnerXml(); | 讀取當前節點以下的所有內容(包括標記和子級) |
string ReadOuterXml(); | 讀取當前節點和所有它的子級的內容(包括標記) |
string ReadString(); | 讀取文本節點的內容 |
XmlReader ReadSubtree(); | 返回新的 XmlReader 實例,此實例可用于讀取當前節點及其所有子節點 |
void Skip(); | 跳過當前節點的子級 |
3.XMLTextReader 類的一些不常用的方法:
方法 | 描述 |
---|---|
int ReadChars(char[] buffer, int index, int count); | 將元素的文本內容讀入字符緩沖區 通過連續調用此方法,可以讀取大的嵌入文本的流 |
int ReadValueChunk(char[] buffer, int index, int count); | 讀取嵌入在 XML 文檔中的大量文本流 |
string ReadContentAsString(); | 將當前文本內容轉為 String 對象讀取,僅支持文本節點 |
object ReadContentAsObject(); | 將當前文本內容轉為 Object 對象讀取,僅支持文本節點 |
bool ReadContentAsBoolean(); | 當前文本內容轉為 Boolean 對象讀取,僅支持文本節點 |
DateTime ReadContentAsDateTime(); | 將當前文本內容轉為 DateTime 對象讀取,僅支持文本節點 |
DateTimeOffset ReadContentAsDateTimeOffset(); | 將當前文本內容轉為 DateTimeOffset 對象讀取,僅支持文本節點 |
decimal ReadContentAsDecimal(); | 將當前文本內容轉為 Decimal 對象讀取,僅支持文本節點 |
double ReadContentAsDouble(); | 將當前文本內容轉為 雙精度浮點數 對象讀取,僅支持文本節點 |
float ReadContentAsFloat(); | 將當前文本內容轉為 單精度浮點數 對象讀取,僅支持文本節點 |
int ReadContentAsInt(); | 將當前文本內容轉為 32 位有符號整數讀取,僅支持文本節點 |
long ReadContentAsLong(); | 將當前文本內容轉為 64 位有符號整數讀取,僅支持文本節點 |
object ReadElementContentAsObject(); | 將當前文本內容轉為 Object 返回,僅支持有內容的元素節點 |
string ReadElementContentAsString(); | 將當前文本內容轉為 String 對象返回,僅支持有內容的元素節點 |
bool ReadElementContentAsBoolean(); | 將當前文本內容轉為 Boolean 對象返回,僅支持有內容的元素節點 |
DateTime ReadElementContentAsDateTime(); | 將當前文本內容轉為 DateTime 對象返回,僅支持有內容的元素節點 |
decimal ReadElementContentAsDecimal(); | 將當前文本內容轉為 Decimal 對象返回,僅支持有內容的元素節點 |
double ReadElementContentAsDouble(); | 將當前文本內容轉為 雙精度浮點數 對象返回,僅支持有內容的元素節點 |
float ReadElementContentAsFloat(); | 將當前文本內容轉為 單精度浮點數 對象返回,僅支持有內容的元素節點 |
int ReadElementContentAsInt(); | 將當前文本內容轉為 32 位有符號整數返回,僅支持有內容的元素節點 |
long ReadElementContentAsLong(); | 將當前文本內容轉為 64 位有符號整數返回,僅支持有內容的元素節點 |
代碼演示:
由于內容太多,這里只演示代碼,不截圖運行結果,屬性和方法的細節,都會在代碼中進行解釋。
演示用的XML文檔如下:
<?xml version="1.0" encoding="utf-8"?>
<bookstore><book Type="必修課" ISBN="7-111-19149-2" xmlns="https://www.csdn.net/"><title>數據結構</title><author>嚴蔚敏</author><price>30.00</price></book><book Type="必修課" ISBN="7-111-19149-3"><title>路由型與交換型互聯網基礎</title><author>程慶梅</author><price>27.00</price></book><book Type="必修課" ISBN="7-111-19149-4"><title>計算機硬件技術基礎</title><author>李繼燦</author><price>25.00</price></book><book Type="必修課" ISBN="7-111-19149-5"><title>軟件質量保證與管理</title><author>朱少民</author><price>39.00</price></book><book Type="必修課" ISBN="7-111-19149-6"><title>算法設計與分析</title><author>王紅梅</author><price>23.00</price></book><book Type="選修課" ISBN="7-111-19149-1"><title>計算機操作系統</title><author>7-111-19149-1</author><price>28</price></book>
</bookstore>
溫馨提示,直接運行代碼編譯器會卡死,請有選擇性的注釋掉部分代碼再運行
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;namespace XML操作
{class Program{static void Main(string[] args){XmlTextReaderTest();Console.WriteLine("~~~~~~~~ END ~~~~~~~~");Console.ReadKey();}/// <summary>/// 一個簡單輸出方法/// </summary>static void C(string str, object obj){Console.WriteLine("n {0}: {1}", str, obj);Console.WriteLine(" ------------------------------");}static void C(int i, string str){Console.WriteLine(" {0}.{1}", i, str);}static string filePath3 = @"C:UsersAdministratorDesktopTemptest3.xml";/// <summary>/// XmlTextReader 測試用主函數/// </summary>static void XmlTextReaderTest(){XmlTextReader textReader = new XmlTextReader(filePath3);textReader.WhitespaceHandling = WhitespaceHandling.None;while (textReader.Read()){if (textReader.NodeType == XmlNodeType.Element){XmlAttribute(textReader);XmlMethod(textReader);}if (textReader.NodeType == XmlNodeType.Text){XmlAttribute(textReader);XmlMethod(textReader);}if (textReader.NodeType == XmlNodeType.EndElement){XmlAttribute(textReader);XmlMethod(textReader);}}//讀取完畢后要記得關閉流,否則會占用文檔,無法被其它線程打開textReader.Close();}/// <summary>/// XmlTextReader 屬性/// </summary>static void XmlAttribute(XmlTextReader textReader){Console.WriteLine("/");C(1, "獲取或設置一個值,該值指定如何處理空白區域");//該屬性可以在讀取器讀取XML文檔時控制是否讀取空白區域//一般是在構造好以后進行設置,在讀取時設置也可以,但是在設置以前已經讀取的內容,還是會讀取到空白區域WhitespaceHandling whitespaceHandling = textReader.WhitespaceHandling;C("whitespaceHandling", whitespaceHandling);C(2, "獲取當前節點的地址");//如果是網絡XML,就會獲取到網絡地址string baseURI = textReader.BaseURI;C("baseURI", baseURI);C(3, "獲取讀取器定位在的節點的命名空間 URI");//該屬性用于獲取網絡XML的節點網絡地址//該地址的屬性命名必須是 xmlns,否則無法讀取地址string namespaceURI = textReader.NamespaceURI;C("namespaceURI", namespaceURI);C(4, "獲取文檔的編碼");Encoding encoding = textReader.Encoding;C("encoding", encoding);C(5, "獲取XML文檔中當前節點的深度");//這里的深度指的是節點的層級,根節點是0,元素節點是1,元素節點子級是2以此類推int depth = textReader.Depth;C("depth", depth);C(6, "獲取當前行號");//指在XML文件中所在的行數int lineNumber = textReader.LineNumber;C("lineNumber", lineNumber);C(7, "獲取當前行位置");//指該標簽在當前行的起始下標,也就是第一個字母的橫向坐標int linePosition = textReader.LinePosition;C("linePosition", linePosition);C(8, "判斷讀取器是否定位在流結尾");//很好理解,當讀取完所有值時,讀取器就會在流的結尾處//只有在While循環完畢后,指針才會在流的結尾處,在循環體內時,并不會在結尾bool eOF = textReader.EOF;C("eOF", eOF);C(9, "獲取當前節點的類型");XmlNodeType nodeType = textReader.NodeType;C("nodeType", nodeType);C(10, "獲取當前節點的文本值");//只能獲取 XmlNodeType 類型為 Text 類型的節點的文本值string value = textReader.Value;C("value", value);C(11, "判斷當前節點是否為空元素");//沒有文本內容以及子級的元素就是空元素,空元素可以有屬性bool isEmptyElement = textReader.IsEmptyElement;C("isEmptyElement", isEmptyElement);C(12, "判斷是否規范化空白區域和屬性值");bool normalization = textReader.Normalization;C("normalization", normalization);C(13, "獲取當前節點的本地名稱");//經過多次測試,LocalName和Name我依然分不清有啥區別//求高人指點string localName = textReader.LocalName;C("localName", localName);C(14, "獲取當前節點的限定名稱");string name = textReader.Name;C("name", name);C(15, "獲取指定索引處屬性的值(XmlReader)");//如果指定索引位置沒有屬性,運行時會報錯try{string item = textReader[0];C("item[int]", item);}catch (Exception){Console.WriteLine(" 無屬性可索引 n");}C(16, "獲取具有指定LocalName和NamespaceURI的屬性的值(XmlReader)");//索引無效時會返回null不會報錯//看似索引也沒問題,不知為何就是返回null//求高人指點string item2 = textReader["book", "xmlns"];if (item2 == null){C("item[string, string]", "null");}else{C("item[string, string]", item2);}C(17, "獲取具有指定Name的屬性的值(XmlReader)");//索引無效時會返回null不會報錯string item3 = textReader["Type"];if (item3 == null){C("item[string]", "null");}else{C("item[string]", item3);}C(18, "判斷當前節點是否有任何屬性(XmlReader)");bool hasAttributes = textReader.HasAttributes;C("hasAttributes", hasAttributes);C(19, "獲取當前節點上的屬性數目");int attributeCount = textReader.AttributeCount;C("attributeCount", attributeCount);C(20, "獲取與當前節點關聯的命名空間前綴");string prefix = textReader.Prefix;C("prefix", prefix);C(21, "獲取用于括起屬性節點的值的引號字符");//經過測試,無論是單引號還是雙引號,都是輸出雙引號//耐人尋味呢char quoteChar = textReader.QuoteChar;C("quoteChar", quoteChar);C(22, "獲取讀取器的狀態");//讀取器狀態為枚舉類型,主要用來判斷當前讀取進度或者狀態//例如:正在讀取,讀取報錯,關閉讀取,讀取完畢等ReadState readState = textReader.ReadState;C("readState", readState);C(23, "獲取用于創建此XmlReader實例的XmlReaderSettings對象(XmlReader)");//XmlReaderSettings用來設置XML讀取方式,要配合XmlReader使用XmlReaderSettings settings = textReader.Settings;C("settings", settings);C(24, "獲取當前節點的公共語言運行時類型(XmlReader)");Type valueType = textReader.ValueType;C("valueType", valueType);C(25, "獲取當前 xml:lang 范圍");//???string xmlLang = textReader.XmlLang;C("xmlLang", xmlLang);C(26, "獲取當前 xml:space 范圍");//???XmlSpace xmlSpace = textReader.XmlSpace;C("xmlSpace", xmlSpace);C(27, "判斷當前節點是否可以具有 String.Empty 以外的 Value");bool hasValue = textReader.HasValue;C("hasValue", hasValue);C(28, "獲取或設置是否進行命名空間支持");bool namespaces = textReader.Namespaces;C("namespaces", namespaces);C(29, "判斷節點是否實現二進制內容讀取方法");bool canReadBinaryContent = textReader.CanReadBinaryContent;C("canReadBinaryContent", canReadBinaryContent);C(30, "判斷節點是否實現 ReadValueChunk(Char[], Int32, Int32) 方法");bool canReadValueChunk = textReader.CanReadValueChunk;C("canReadValueChunk", canReadValueChunk);C(31, "判斷讀取器是否可以分析和解析實體");//???bool canResolveEntity = textReader.CanResolveEntity;C("canResolveEntity", canResolveEntity);C(32, "獲取或設置一個值,該值指定讀取器處理實體的方式");//???EntityHandling entityHandling = textReader.EntityHandling;C("entityHandling", entityHandling);C(33, "獲取與此實現關聯的 XmlNameTable");XmlNameTable nameTable = textReader.NameTable;C("nameTable", nameTable);Console.WriteLine("*******************************");}/// <summary>/// XmlTextReader 方法/// </summary>static void XmlMethod(XmlTextReader textReader){Console.WriteLine("///");Console.WriteLine("整個Reader的操作:");//關閉流,并釋放資源textReader.Close();//釋放當前使用的所有資源 (XmlReader)textReader.Dispose();//獲取當前節點外XML的剩余部分,返回TextReaderusing (TextReader text = textReader.GetRemainder()){StringBuilder stringBuilder = new StringBuilder(text.ReadToEnd());Console.WriteLine(stringBuilder);}Console.WriteLine("///");Console.WriteLine("節點之間的操作:");//從流中讀取下一個節點,調用一次就只會讀取一次//Read()的讀取方式是一個節點一個節點的讀取,并不是一次性讀完一整行//比如 <title>數據結構</title>,這里會分為三次讀取,讀取步驟如下://1.<title>(開始元素節點Element)//2.數據結構(文本節點Text)//3.</title>(結束元素節點EndElement)bool read = textReader.Read();C("read", read);C("read", textReader.Name);//跳過 非內容節點 至下一個 內容節點//內容節點(非空節點TextCDATAElementEndElementEntityReferenceEndEntity)XmlNodeType moveToContent = textReader.MoveToContent();C("moveToContent", moveToContent);//跳過非內容節點,判斷當前節點是否為指定元素的開始節點bool isStartElement = textReader.IsStartElement("price");C("isStartElement", isStartElement);//跳過Element節點至下一個節點(XmlReader)//當前節點必須是Element類型,否則會報錯textReader.ReadStartElement();//跳過 指定元素開始節點 至下一個節點(XmlReader)//當前節點必須是指定的元素,同時必須是開始節點,否則會報錯textReader.ReadStartElement("book");//跳過EndElement節點至下一個節點(XmlReader)//當前節點必須是EndElement類型,否則會報錯textReader.ReadEndElement();//跳到第一個具有指定限定名的子代元素(XmlReader)//并且只有該指定子級會被完整讀取所有節點//下一行開始,所有子級只讀取元素節點不讀取文本節點textReader.ReadToDescendant("price");//一直讀取,直到找到所有具有指定限定名的元素(XmlReader)//該過程會跳過所有非指定元素節點,并且匹配到的是開始標簽,不會匹配到結束標簽//如果存在相同的元素節點,那么會繼續跳過其它所有節點獲取指定元素//特別注意的是,如果找不到對應名稱的節點,那么就會直接讀到結尾,并且節點為nulltextReader.ReadToFollowing("title");C("petId", textReader.ReadString());//一直讀取,前進到下一個具有指定限定名的同級元素(XmlReader)//需要先把指針定位在指定元素的深度,該方法只會在同一深度的標簽中查找具有指定name的下一個元素//如果該深度不存在指定元素,那么會直接結束textReader.ReadToNextSibling("title");//將讀取器的狀態重置為 ReadState.Initial//該方法會停止Read方法讀取數據,如果是在循環過程中使用,會報錯textReader.ResetState();Console.WriteLine("///");Console.WriteLine("單個節點的操作:");//獲取具有指定索引的屬性的值string getAttribute_int = textReader.GetAttribute(0);C("GetAttribute(int)", getAttribute_int);//獲取具有指定屬性名稱的屬性值string getAttribute_string = textReader.GetAttribute("ISBN");C("GetAttribute(string)", getAttribute_string);//獲取一個集合,該集合包含當前在范圍內的所有命名空間IDictionary<string, string> getNamespacesInScope = textReader.GetNamespacesInScope(XmlNamespaceScope.All);foreach (var item in getNamespacesInScope.Keys){C("GetNamespacesInScope[key]", item);C("GetNamespacesInScope[value]", getNamespacesInScope[item]);}//移動到具有指定索引的屬性//通過int索引時,如果該節點沒有屬性,會報錯try{textReader.MoveToAttribute(0);}catch (Exception) { }//移動到具有指定名稱的屬性//使用string索引時,沒有屬性不會報錯,返回bool值確定是否存在指定順序性textReader.MoveToAttribute("Type");//判斷指針是否移動到屬性節點//該方法無法移動指針,只能判斷當前指針是否在屬性節點上textReader.MoveToElement();//移動到第一個屬性textReader.MoveToFirstAttribute();//移動到下一個屬性//如果當前指針不在屬性上,則移動到第一個屬性,如果在屬性上,則移動到下一個屬性,textReader.MoveToNextAttribute();//將屬性值分析為一個或多個 Text、EntityReference 或 EndEntity 節點//指針必需移動到屬性節點上textReader.ReadAttributeValue();//讀取純文本元素//1.如果該節點沒有文本,運行會報錯//2.使用try/catch可以跳過報錯,如果不使用string指定標簽,指針還會跳到下一個有文本的節點上(為啥呢?)try{string readElementString = textReader.ReadElementString();C("readElementString", readElementString);}catch (Exception) { }//讀取當前節點以下的所有內容(包括標記和子級)(XmlReader)//該方法不包括讀取自身內容C("ReadInnerXml", textReader.ReadInnerXml());//讀取當前節點和所有它的子級的內容(包括標記)(XmlReader)//該方法包括讀取自身內容C("ReadOuterXml", textReader.ReadOuterXml());//讀取文本節點的內容C("ReadString", textReader.ReadString());//返回新的 XmlReader 實例,此實例可用于讀取當前節點及其所有子節點(XmlReader)//只能在元素節點上調用該方法C("ReadSubtree", textReader.ReadSubtree());//跳過當前節點的子級textReader.Skip();Console.WriteLine("///");Console.WriteLine("不常用的單個節點的操作:");//將元素的文本內容讀入字符緩沖區 通過連續調用此方法,可以讀取大的嵌入文本的流char[] ch = new char[1024];int readChars = textReader.ReadChars(ch, 0, ch.Length);Console.WriteLine(readChars);Console.WriteLine(ch);//讀取嵌入在 XML 文檔中的大量文本流(XmlReader)//提示不支持該方法,????char[] ch2 = new char[1024];int readValueChunk = textReader.ReadValueChunk(ch2, 0, ch2.Length);//將當前文本內容轉為 String 對象讀取(XmlReader),僅支持文本節點string readContentAsString = textReader.ReadContentAsString();Console.WriteLine("ReadContentAsString: {0}", readContentAsString);//將當前文本內容轉為 Object 對象讀取(XmlReader),僅支持文本節點var readContentAsObject = textReader.ReadContentAsObject();Console.WriteLine("ReadContentAsObject: {0}", readContentAsObject);//將當前文本內容轉為 Boolean 對象讀取(XmlReader),僅支持文本節點//文本內容必須為讀取類型的值才能讀取,必須是 true/false,否則會報錯var readContentAsBoolean = textReader.ReadContentAsBoolean();Console.WriteLine("ReadContentAsBoolean: {0}", readContentAsBoolean);//將當前文本內容轉為 DateTime 對象讀取(XmlReader),僅支持文本節點//規則同上DateTime readContentAsDateTime = textReader.ReadContentAsDateTime();Console.WriteLine("ReadContentAsDateTime: {0}", readContentAsDateTime);//將當前文本內容轉為 DateTimeOffset 對象讀取(XmlReader),僅支持文本節點//規則同上var readContentAsDateTimeOffset = textReader.ReadContentAsDateTimeOffset();Console.WriteLine("ReadContentAsDateTimeOffset: {0}", readContentAsDateTimeOffset);//將當前文本內容轉為 Decimal 對象讀取(XmlReader),僅支持文本節點//規則同上var readContentAsDecimal = textReader.ReadContentAsDecimal();Console.WriteLine("ReadContentAsDecimal: {0}", readContentAsDecimal);//將當前文本內容轉為 雙精度浮點數 對象讀取(XmlReader),僅支持文本節點//規則同上var readContentAsDouble = textReader.ReadContentAsDouble();Console.WriteLine("ReadContentAsDouble: {0}", readContentAsDouble);//將當前文本內容轉為 單精度浮點數 對象讀取(XmlReader),僅支持文本節點//規則同上var readContentAsFloat = textReader.ReadContentAsFloat();Console.WriteLine("ReadContentAsFloat: {0}", readContentAsFloat);//將當前文本內容轉為 32 位有符號整數讀取(XmlReader),僅支持文本節點//規則同上var readContentAsInt = textReader.ReadContentAsInt();Console.WriteLine("ReadContentAsInt: {0}", readContentAsInt);//將當前文本內容轉為 64 位有符號整數讀取(XmlReader),僅支持文本節點//規則同上var readContentAsLong = textReader.ReadContentAsLong();Console.WriteLine("ReadContentAsLong: {0}", readContentAsLong);//將當前文本內容轉為 Object 返回(XmlReader),僅支持有內容的元素節點//讀取時無法讀取注釋,且該節點不能包含子級,讀取完以后,指針會指向下個節點var readElementContentAsObject = textReader.ReadElementContentAsObject();Console.WriteLine("ReadElementContentAsObject: {0}", readElementContentAsObject);//將當前文本內容轉為 String 對象返回(XmlReader),僅支持有內容的元素節點//讀取時無法讀取注釋,且該節點不能包含子級,讀取完以后,指針會指向下個節點var readElementContentAsString = textReader.ReadElementContentAsString();Console.WriteLine("ReadElementContentAsString: {0}", readElementContentAsString);//將當前文本內容轉為 Boolean 對象返回(XmlReader),僅支持有內容的元素節點//1.文本內容必須為讀取類型的值才能讀取//2.讀取時無法讀取注釋,且該節點不能包含子級//3.讀取完以后,指針會指向下個節點var readElementContentAsBoolean = textReader.ReadElementContentAsBoolean();Console.WriteLine("ReadElementContentAsBoolean: {0}", readElementContentAsBoolean);//將當前文本內容轉為 DateTime 對象返回(XmlReader),僅支持有內容的元素節點//規則同上var readElementContentAsDateTime = textReader.ReadElementContentAsDateTime();Console.WriteLine("ReadElementContentAsDateTime: {0}", readElementContentAsDateTime);//將當前文本內容轉為 Decimal 對象返回(XmlReader),僅支持有內容的元素節點//規則同上var readElementContentAsDecimal = textReader.ReadElementContentAsDecimal();Console.WriteLine("ReadElementContentAsDecimal: {0}", readElementContentAsDecimal);//將當前文本內容轉為 雙精度浮點數 對象返回(XmlReader),僅支持有內容的元素節點//規則同上var readElementContentAsDouble = textReader.ReadElementContentAsDouble();Console.WriteLine("ReadElementContentAsDouble: {0}", readElementContentAsDouble);//將當前文本內容轉為 單精度浮點數 對象返回(XmlReader),僅支持有內容的元素節點//規則同上var readElementContentAsFloat = textReader.ReadElementContentAsFloat();Console.WriteLine("ReadElementContentAsFloat: {0}", readElementContentAsFloat);//將當前文本內容轉為 32 位有符號整數返回(XmlReader),僅支持有內容的元素節點//規則同上var readElementContentAsInt = textReader.ReadElementContentAsInt();Console.WriteLine("ReadElementContentAsInt: {0}", readElementContentAsInt);//將當前文本內容轉為 64 位有符號整數返回(XmlReader),僅支持有內容的元素節點//規則同上var readElementContentAsLong = textReader.ReadElementContentAsLong();Console.WriteLine("ReadElementContentAsLong: {0}", readElementContentAsLong);Console.WriteLine("*******************************");}}
}