詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法
XmlTextReader 提供對 XML 數(shù)據(jù)流的只進(jìn)只讀訪問。當(dāng)前節(jié)點指讀取器定位到的節(jié)點。使用任何讀方法推進(jìn)讀取器并且屬性反映當(dāng)前節(jié)點的值。
此類實現(xiàn) XmlReader 并符合 W3C 可擴展標(biāo)記語言 (XML) 1.0 和“XML 中的命名空間”建議。XmlTextReader 提供以下功能:
- 執(zhí)行格式良好的 XML 的規(guī)則。
- XmlTextReader 不提供數(shù)據(jù)驗證。
- 檢查 DocumentType 節(jié)點是否是格式良好的。XmlTextReader 檢查 DTD 的格式是否正確,但不使用 DTD 進(jìn)行驗證。
- 對于 NodeType 為 XmlNodeType.EntityReference 的節(jié)點,返回單個空 EntityReference 節(jié)點(即 Value 屬性為 String.Empty)。
- 不展開默認(rèn)屬性。
因為 XmlTextReader 不執(zhí)行數(shù)據(jù)驗證所需的額外檢查,所以它提供快速格式正確性分析器。
若要執(zhí)行數(shù)據(jù)驗證,請使用驗證 XmlReader。有關(guān)更多信息,請參見 使用 XmlReader 驗證 XML 數(shù)據(jù)。
若要從 XmlDocument 中讀取 XML 數(shù)據(jù),請使用 XmlNodeReader。
XmlTextReader 在發(fā)生 XML 分析錯誤時引發(fā) XmlException。引發(fā)異常后,讀取器的狀態(tài)不可預(yù)知。例如,報告的節(jié)點類型可能不同于當(dāng)前節(jié)點的實際節(jié)點類型。使用 ReadState 屬性可以檢查讀取器是否處于錯誤狀態(tài)。
有關(guān) XmlReader 類的進(jìn)一步論述,請參見 用 XmlReader 讀取 XML。
安全注意事項:
- 下面是使用 XmlTextReader 類時的注意事項。
- XmlTextReader 引發(fā)的異??赡軙孤┠幌M芭莸綉?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è)計應(yīng)用程序以使 XML 處理受內(nèi)存和時間的約束。例如,在 ASP.NET 應(yīng)用程序中配置超時限制。
- XML 數(shù)據(jù)可包括對 DTD 文件等外部資源的引用。在默認(rèn)情況下,使用不具有用戶憑據(jù)的 XmlUrlResolver 對象解析外部資源。通過執(zhí)行下列操作之一,可以使此操作更加安全:
- 通過將 XmlResolver 屬性設(shè)置為 XmlSecureResolver 對象限制 XmlTextReader 可訪問的資源。
- 通過將 XmlResolver 屬性設(shè)置為空引用(在 Visual Basic 中為 Nothing) 不允許 XmlReader 打開任何外部資源。
- XML 數(shù)據(jù)可以包含大量需要很多時間才能處理的屬性、命名空間聲明、嵌套元素等。若要限制發(fā)送到 XmlTextReader 的輸入的大小,請創(chuàng)建自定義的 IStream 實現(xiàn)并為其提供 XmlTextReader。
- ReadValueChunk 方法可用于處理大的數(shù)據(jù)流。此方法一次讀取少量字符,而不是為整個值分配一個字符串。
- 默認(rèn)情況下不展開常規(guī)實體。調(diào)用 ResolveEntity 方法時展開常規(guī)實體。
示例:
使用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())//閱讀下一個
{
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)會把整個文檔的結(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é)點的所有子節(jié)點,放到XmlNodeList中
foreach (XmlNode node in list)//從list中遍歷所有節(jié)點
{
XmlElement ele = (XmlElement)node;//節(jié)點可以有中間文本但是沒有屬性值,所以要先轉(zhuǎn)成element才能讀出屬性值
Console.WriteLine(ele.GetAttribute("id") + " " + ele.GetAttribute("age") + " " + ele.InnerText);//讀取數(shù)據(jù)/顯示
}
Console.ReadKey();
}

執(zhí)行效果完全一樣
- C#讀取XML的CDATA節(jié)點內(nèi)容實例詳解
- C#實現(xiàn)XML文件讀取
- c#讀取XML多級子節(jié)點
- C# 創(chuàng)建,讀取,寫入XML文件
- C#讀取XML的三種實現(xiàn)方式
- 詳解c#讀取XML的實例代碼
- C#中如何使用 XmlReader 讀取XML文件
- C# winfrom實現(xiàn)讀取修改xml
- C#保存與讀取DataTable信息到XML格式的方法
- C#讀取xml節(jié)點數(shù)據(jù)方法小結(jié)
- C#從文件流讀取xml文件到DataSet并顯示的方法
- C#讀取Excel并轉(zhuǎn)化成XML的方法
- c# 讀取XML文件的示例
相關(guān)文章
C#?Winform實現(xiàn)在Pancel上繪制矩形
在C#的WinForms應(yīng)用程序中,Panel控件本身不直接支持繪圖功能,但可以通過在Panel上覆蓋OnPaint方法或者使用Graphics對象來在Panel上繪制圖形,下面我們就來看看具體實現(xiàn)方法吧2025-01-01
C#?Windows?Forms中實現(xiàn)控件之間的連接線的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何在C#?Windows?Forms應(yīng)用程序中實現(xiàn)繪圖工具中多個控件之間的連接線功能,文中的示例代碼講解詳細(xì),需要的可以參考下2024-02-02
C#?實現(xiàn)Ping遠(yuǎn)程主機功能及代碼演示
這篇文章主要介紹了C#?實現(xiàn)Ping遠(yuǎn)程主機功能,本教程將演示1.0.2版本更新功能,以及實現(xiàn)的具體代碼演示,需要的朋友可以參考下2024-05-05

