C#中如何使用 XmlReader 讀取XML文件
XmlReader通過向前讀取文檔并識別讀取到的元素,為我們提供了一種消耗資源最少的方式來解析XML數(shù)據(jù)。很多時候我們都是利用XmlReader來對XML文件的數(shù)據(jù)有效性進行驗證(使用XmlReader實例的Read()方法依次讀取所有節(jié)點,以此判斷是否與符合指定的模式)。使用這種非緩存、只讀、只向前的方式,每次讀取只將很少的數(shù)據(jù)放入內(nèi)存,對內(nèi)存的占用量較小,對于讀取內(nèi)容較大的XML文件不失為一種最佳的選擇。
讓我們看看XmlReader類讀取XML文件的步驟:
1、使用XmlReader類的Create()工廠方法創(chuàng)建該類的一個實例,并將被讀取的XML文件名作為參數(shù)傳入方法;
2、建立一個反復調(diào)用Read()方法的循環(huán)。這個方法從文件的第一個節(jié)點開始,然后讀取所有余下的節(jié)點,但每次調(diào)用只讀取一個節(jié)點。如果存在一個節(jié)點可被讀取則返回True,而當?shù)竭_文件最后時則返回False;
3、在這個循環(huán)中,將檢查XmlReader實例的屬性和方法,以獲得關(guān)于當前節(jié)點的信息(節(jié)點的類型、名稱、數(shù)據(jù)等)。不斷執(zhí)行循環(huán)直到Read()返回False;
下面首先看一個示例:
Employees.xml文件:
<?xml version='1.0'?> <employees> <employee id="1"> <name> <firstName>Nancy</firstName> <lastName>Davolio</lastName> </name> <city>Seattle</city> <state>WA</state> <zipCode>98122</zipCode> </employee> <employee id="2"> <name> <firstName>Andrew</firstName> <lastName>Fuller</lastName> </name> <city>Tacoma</city> <state>WA</state> <zipCode>98401</zipCode> </employee> </employees>
aspx代碼:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
//Location of XML file
string xmlFilePath = Server.MapPath("~/Employees.xml");
try
{
using (XmlReader reader = XmlReader.Create(xmlFilePath))
{
string result;
while (reader.Read())
{
//Process only the elements
if (reader.NodeType == XmlNodeType.Element)
{
result = "";
for (int count = 1; count <= reader.Depth; count++)
{
result += "===";
}
result += "=> " + reader.Name + "<br/>";
lblResult.Text += result;
}
}
}
}
catch (Exception ex)
{
lblResult.Text = "An Exception occurred: " + ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Reading an XML File using XmlReader</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:label id="lblResult" runat="server" />
</div>
</form>
</body>
</html>
輸出結(jié)果:
=> employees
====> employee
=======> name
==========> firstName
==========> lastName
=======> city
=======> state
=======> zipCode
====> employee
=======> name
==========> firstName
==========> lastName
=======> city
=======> state
=======> zipCode
下面讓我們看看XmlReader類的屬性和方法:
| 屬 性 | 說 明 |
|---|---|
| AttributeCount | 返回當前節(jié)點的屬性個數(shù) |
| Depth | 返回當前節(jié)點的深度,用于判斷指定的節(jié)點是否具有子節(jié)點 |
| EOF | 判斷讀取器是否位于流的末端 |
| HasAttribute | 返回指示當前節(jié)點是否具有屬性的布爾值 |
| HasValue | 返回指示當前節(jié)點是否具有值的布爾值 |
| IsEmptyElement | 判斷當前節(jié)點是否是一個空元素 |
| LocalName | 返回當前節(jié)點的本地名稱 |
| Name | 返回當前節(jié)點的限定名稱 |
| NamespaceURI | 返回當前節(jié)點的命名空間URI |
| NodeType | 以XmlNodeType枚舉的形式返回當前節(jié)點的節(jié)點類型 |
| Prefix | 返回與當前節(jié)點相關(guān)的命名空間前綴 |
| ReadState | 以ReadState枚舉的形式返回讀取器的當前狀態(tài) |
| Settings | 返回用于創(chuàng)建XmlReader實例的XmlReaderSettings對象 |
| Value | 返回當前節(jié)點的值 |
| ValueType | 獲得當前節(jié)點的CLR類型 |
XmlReader類的重要方法:
| 方 法 | 說 明 |
|---|---|
| Close | 通過將ReadState枚舉設置為Closed來關(guān)閉Xmlreader對象 |
| Create | 創(chuàng)建XmlReader對象的實例并將其返回給調(diào)用程序 |
| GetAttribute | 獲得屬性的值 |
| IsStartElement | 指示當前節(jié)點是否是開始標簽 |
| MoveToAttribute | 移動讀取器到指定的屬性 |
| MoveToContent | 如果當前節(jié)點不是內(nèi)容節(jié)點,則移動讀取器至下一個內(nèi)容節(jié)點 |
| MoveToElement | 移動讀取器至包含當前屬性的元素;用于列舉屬性以及想切換至包含所有這些屬性的元素 |
| MoveToFirstAttribute | 移動讀取器至當前節(jié)點的第一個屬性 |
| MoveToNextAttribute | 移動讀取器至當前節(jié)點的下一個屬性 |
| Read | 從流中讀取下一個節(jié)點 |
| ReadContentAs | 讀取提供類型的對象的內(nèi)容 |
| ReadElementContentAs | 讀取當前元素并返回指定類型對象的內(nèi)容 |
| ReadEndElement | 移動讀取器越過當前結(jié)束標簽并移動到下一個節(jié)點 |
| ReadInnerXml | 以字符串的形式讀取包括標記在內(nèi)的當前節(jié)點所有內(nèi)容 |
| ReadOutXml | 讀取包括當前節(jié)點標記和子節(jié)點在內(nèi)的節(jié)點的內(nèi)容 |
| ReadToDescendant | 移動讀取器至下一個匹配子孫元素的節(jié)點 |
| ReadToFollowing | 不斷讀取直至找到指定的元素 |
| ReadToNextSlibing | 移動讀取器至下一個匹配兄弟元素的節(jié)點 |
| ReadValueChunk | 允許讀取嵌入在XML文檔中的大型文本流 |
XmlNodeType枚舉的成員:
| 成 員 | 說 明 |
|---|---|
| Attribute | 屬性 |
| CDATA | CDATA區(qū)域 |
| Comment | XML注釋 |
| Document | 文檔對象,表示XML樹的根 |
| DocumentFragment | 文檔片斷 |
| DocumentType | 文檔類型聲明 |
| Element,EndElement | 開始元素和結(jié)束元素 |
| Entity,EndEntity | 開始實體聲明和結(jié)束實體聲明 |
| EntityReference | 實體引用(如<) |
| None | 有沒有讀取節(jié)點而查詢節(jié)點類型時使用 |
| Notation | DTD中的符號條目 |
| ProcessingInstruction | XML處理指令 |
| SignificantWhitespace | 在混合內(nèi)容模型文檔中的空白,或者設置了xml:space=preserve時使用 |
| Text | 元素的文本內(nèi)容 |
| Whitespace | 標記之間的空白 |
| XmlDeclaration | 在文檔頂部的XML聲明 |
XmlReaderSettings類的重要屬性:
| 屬 性 | 說 明 |
|---|---|
| CheckCharacters | 允許你獲得或者設置用于指示是否執(zhí)行字符檢查的值 |
| ConformanceLevel | 獲得或設置XmlReader對象的符合要求 |
| IgnoreComment | 允許你獲得或設置用于指示是否忽略注釋的值 |
| IgnoreProcessingInstruct |
指定是否忽略處理指令 |
| IgnoreWhitespace | 指定是否忽略無意義的空格 |
| ProhibitDtd | 指定是否允許DTD處理 |
| Schemas | 指定在執(zhí)行XML驗證時使用的XmlSchemaSet |
| ValidationFlags | 獲得或者設置用于指定模式驗證設置的值 |
| ValidationType | 獲得或者設置用于指定所執(zhí)行的驗證類型的值 |
| XmlResolver | 設置用于訪問外部文檔的XmlReslover |
通過XmlReaderSettings類,你可以指定一系列由XmlReader對象支持的功能,為此,只需將XmlReaderSettings作為參數(shù)傳入XmlReader的Create()方法中即可。如下所示:
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
string xmlFilePath = Server.Mappath("~/Employees.xml");
//Create the XmlReaderSettings object and set appropriate properties
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.IgnoreWhitespace = true;
try
{
//Get reference to the XmlReader object
using (XmlReader reader = XmlReader.Create(xmlFilePath, settings))
{
string result;
while (reader.Read())
{
//Process only the elements
if (reader.NodeType == XmlNodeType.Element)
{
//Reset the variable for a new element
result = "";
for (int count = 1; count <= reader.Depth; count++)
{
result += "===";
}
result += "=> " + reader.Name + "<br/>";
lblResult.Text += result;
}
}
}
}
catch (Exception ex)
{
lblResult.Text = "An Exception occurred: " + ex.Message;
}
}
</script>
總結(jié)下來,我們可以使用XmlReader類以非緩存、只讀、只向前的方式讀取XML文件,這種方法占用內(nèi)存少,推薦大家使用。
上一篇:C#清除WebBrowser中Cookie緩存的方法
欄 目:C#教程
下一篇:C# ComboBox的聯(lián)動操作(三層架構(gòu))
本文標題:C#中如何使用 XmlReader 讀取XML文件
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6521.html
您可能感興趣的文章
- 01-10C#通過反射獲取當前工程中所有窗體并打開的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)由四周向中心縮小的窗體退出特效
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#使用Dispose模式實現(xiàn)手動對資源的釋放
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10C#中DataGridView常用操作實例小結(jié)
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10C#使用windows服務開啟應用程序的方法
- 01-10asp.net中XML如何做增刪改查操作


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


