詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法
XmlTextReader 提供對(duì) XML 數(shù)據(jù)流的只進(jìn)只讀訪問。當(dāng)前節(jié)點(diǎn)指讀取器定位到的節(jié)點(diǎn)。使用任何讀方法推進(jìn)讀取器并且屬性反映當(dāng)前節(jié)點(diǎn)的值。
此類實(shí)現(xiàn) XmlReader 并符合 W3C 可擴(kuò)展標(biāo)記語言 (XML) 1.0 和“XML 中的命名空間”建議。XmlTextReader 提供以下功能:
- 執(zhí)行格式良好的 XML 的規(guī)則。
- XmlTextReader 不提供數(shù)據(jù)驗(yàn)證。
- 檢查 DocumentType 節(jié)點(diǎn)是否是格式良好的。XmlTextReader 檢查 DTD 的格式是否正確,但不使用 DTD 進(jìn)行驗(yàn)證。
- 對(duì)于 NodeType 為 XmlNodeType.EntityReference 的節(jié)點(diǎn),返回單個(gè)空 EntityReference 節(jié)點(diǎn)(即 Value 屬性為 String.Empty)。
- 不展開默認(rèn)屬性。
因?yàn)?XmlTextReader 不執(zhí)行數(shù)據(jù)驗(yàn)證所需的額外檢查,所以它提供快速格式正確性分析器。
若要執(zhí)行數(shù)據(jù)驗(yàn)證,請使用驗(yàn)證 XmlReader。有關(guān)更多信息,請參見 使用 XmlReader 驗(yàn)證 XML 數(shù)據(jù)。
若要從 XmlDocument 中讀取 XML 數(shù)據(jù),請使用 XmlNodeReader。
XmlTextReader 在發(fā)生 XML 分析錯(cuò)誤時(shí)引發(fā) XmlException。引發(fā)異常后,讀取器的狀態(tài)不可預(yù)知。例如,報(bào)告的節(jié)點(diǎn)類型可能不同于當(dāng)前節(jié)點(diǎn)的實(shí)際節(jié)點(diǎn)類型。使用 ReadState 屬性可以檢查讀取器是否處于錯(cuò)誤狀態(tài)。
有關(guān) XmlReader 類的進(jìn)一步論述,請參見 用 XmlReader 讀取 XML。
安全注意事項(xiàng):
- 下面是使用 XmlTextReader 類時(shí)的注意事項(xiàng)。
- XmlTextReader 引發(fā)的異??赡軙?huì)泄漏您不希望冒泡到應(yīng)用程序的路徑信息。應(yīng)用程序必須捕捉異常并進(jìn)行相應(yīng)的處理。
- DTD 處理在默認(rèn)情況下是啟用的。如果擔(dān)心出現(xiàn)拒絕服務(wù)問題或者正在處理不受信任的源,則應(yīng)禁用 DTD 處理。將 ProhibitDtd 屬性設(shè)置為 true 可禁用 DTD 處理。
- 如果啟用了 DTD 處理,則可使用 XmlSecureResolver 限制 XmlTextReader 可訪問的資源。還可以設(shè)計(jì)應(yīng)用程序以使 XML 處理受內(nèi)存和時(shí)間的約束。例如,在 ASP.NET 應(yīng)用程序中配置超時(shí)限制。
- XML 數(shù)據(jù)可包括對(duì) DTD 文件等外部資源的引用。在默認(rèn)情況下,使用不具有用戶憑據(jù)的 XmlUrlResolver 對(duì)象解析外部資源。通過執(zhí)行下列操作之一,可以使此操作更加安全:
- 通過將 XmlResolver 屬性設(shè)置為 XmlSecureResolver 對(duì)象限制 XmlTextReader 可訪問的資源。
- 通過將 XmlResolver 屬性設(shè)置為空引用(在 Visual Basic 中為 Nothing) 不允許 XmlReader 打開任何外部資源。
- XML 數(shù)據(jù)可以包含大量需要很多時(shí)間才能處理的屬性、命名空間聲明、嵌套元素等。若要限制發(fā)送到 XmlTextReader 的輸入的大小,請創(chuàng)建自定義的 IStream 實(shí)現(xiàn)并為其提供 XmlTextReader。
- ReadValueChunk 方法可用于處理大的數(shù)據(jù)流。此方法一次讀取少量字符,而不是為整個(gè)值分配一個(gè)字符串。
- 默認(rèn)情況下不展開常規(guī)實(shí)體。調(diào)用 ResolveEntity 方法時(shí)展開常規(guī)實(shí)體。
示例:
使用XmlTextReader從頭到尾閱讀xml文檔,比較適合大量數(shù)據(jù)讀取
static void Main(string[] args) { XmlTextReader reader; if (File.Exists("student.xml"))//如果文件已存在,載入文檔 { reader = new XmlTextReader("student.xml"); } else//否則 { return; } int count = 0; while (reader.Read())//閱讀下一個(gè) { if (reader.Name == "student") { //顯示讀取的屬性和中間文本 Console.WriteLine(reader.GetAttribute("id") + " " + reader.GetAttribute("age") + " " + reader.ReadString()); count++; } } reader.Close();//關(guān)閉閱讀器 Console.WriteLine("Count is " + count); Console.ReadKey(); }
當(dāng)然也可以用xmlDocument進(jìn)行結(jié)構(gòu)化讀取,但是讀取前系統(tǒng)會(huì)把整個(gè)文檔的結(jié)構(gòu)獲取進(jìn)來
static void Main(string[] args) { XmlDocument doc = new XmlDocument(); if (File.Exists("student.xml"))//如果文件已存在,載入文檔 { doc.Load("student.xml"); } else//否則 { Console.WriteLine("文檔不存在!"); Console.ReadKey(); return; } XmlNodeList list = doc.DocumentElement.SelectNodes("student");//讀取根節(jié)點(diǎn)的所有子節(jié)點(diǎn),放到XmlNodeList中 foreach (XmlNode node in list)//從list中遍歷所有節(jié)點(diǎn) { XmlElement ele = (XmlElement)node;//節(jié)點(diǎn)可以有中間文本但是沒有屬性值,所以要先轉(zhuǎn)成element才能讀出屬性值 Console.WriteLine(ele.GetAttribute("id") + " " + ele.GetAttribute("age") + " " + ele.InnerText);//讀取數(shù)據(jù)/顯示 } Console.ReadKey(); }
執(zhí)行效果完全一樣
欄 目:C#教程
下一篇:總結(jié)C#網(wǎng)絡(luò)編程中對(duì)于Cookie的設(shè)定要點(diǎn)
本文標(biāo)題:詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6599.html
您可能感興趣的文章
- 01-10.net2.0+ Winform項(xiàng)目實(shí)現(xiàn)彈出容器層
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫的方法
- 01-10時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
- 01-10C#中Socket通信用法實(shí)例詳解
- 01-10C#.NET實(shí)現(xiàn)網(wǎng)頁自動(dòng)登錄的方法
- 01-10C#裝箱和拆箱原理詳解
- 01-10實(shí)現(xiàn)ASP.NET無刷新下載并提示下載完成的開發(fā)思路
- 01-10C#類的多態(tài)性詳解
- 01-10C#創(chuàng)建不規(guī)則窗體的4種方式詳解


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文