C#讀取XML的三種實(shí)現(xiàn)方式
前言
XML文件是一種常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,還有許多重要的場(chǎng)所都有它的身影。(類似還有Json)微軟也提供了一系列類庫來倒幫助我們?cè)趹?yīng)用程序中存儲(chǔ)XML文件
在程序中訪問進(jìn)而操作XML文件一般有兩種模型:
DOM(文檔對(duì)象模型):使用DOM的好處在于它允許編輯和更新XML文檔,可以隨機(jī)訪問文檔中的數(shù)據(jù),可以使用XPath查詢,但是,DOM的缺點(diǎn)在于它需要一次性的加載整個(gè)文檔到內(nèi)存中,對(duì)于大型的文檔,這會(huì)造成資源問題。
流模型:流模型很好的解決了這個(gè)問題,因?yàn)樗鼘?duì)XML文件的訪問采用的是流的概念,也就是說,任何時(shí)候在內(nèi)存中只有當(dāng)前節(jié)點(diǎn),但它也有它的不足,它是只讀的,僅向前的,不能在文檔中執(zhí)行向后導(dǎo)航操作。
C#中三種讀取XML文件方法如下:
1.使用 XmlDocument(DOM模式)
2.使用 XmlTextReader(流模式)
3.使用 Linq to Xml(Linq模式)
使用XmlDocument方式讀取
使用XmlDocument是一種基于文檔結(jié)構(gòu)模型的方式來讀取XML文件.在XML文件中,我們可以把XML看作是由文檔聲明(Declare),元素(Element),屬性(Attribute),文本(Text)等構(gòu)成的一個(gè)樹.最開始的一個(gè)結(jié)點(diǎn)叫作根結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都可以有自己的子結(jié)點(diǎn).得到一個(gè)結(jié)點(diǎn)后,可以通過一系列屬性或方法得到這個(gè)結(jié)點(diǎn)的值或其它的一些屬性.例如:
xn 代表一個(gè)結(jié)點(diǎn) xn.Name;//這個(gè)結(jié)點(diǎn)的名稱 xn.Value;//這個(gè)結(jié)點(diǎn)的值 xn.ChildNodes;//這個(gè)結(jié)點(diǎn)的所有子結(jié)點(diǎn) xn.ParentNode;//這個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn)
讀取所有數(shù)據(jù)
使用的時(shí)候,首先聲明一個(gè)XmlDocument對(duì)象,然后調(diào)用Load方法,從指定的路徑加載XML文件.
BookModel是圖書模型
#region XmlDocument讀取
public static void XmlDocumentReadDemo()
{
//list
List<BookModel> bookModeList = new List<BookModel>();
//使用的時(shí)候,首先聲明一個(gè)XmlDocument對(duì)象,然后調(diào)用Load方法,從指定的路徑加載XML文件.
XmlDocument doc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文檔里面的注釋
using (XmlReader reader = XmlReader.Create(@"d:/demo.xml", settings))
{
doc.Load(reader);
//doc.Load(@"d:/demo.xml");
//然后可以通過調(diào)用SelectSingleNode得到指定的結(jié)點(diǎn),通過GetAttribute得到具體的屬性值.參看下面的代碼
// 得到根節(jié)點(diǎn)bookstore
XmlNode xn = doc.SelectSingleNode("bookstore");
// 得到根節(jié)點(diǎn)的所有子節(jié)點(diǎn)
XmlNodeList xnl = xn.ChildNodes;
foreach (XmlNode xn1 in xnl)
{
BookModel bookModel = new BookModel();
// 將節(jié)點(diǎn)轉(zhuǎn)換為元素,便于得到節(jié)點(diǎn)的屬性值
XmlElement xe = (XmlElement)xn1;
// 得到Type和ISBN兩個(gè)屬性的屬性值
bookModel.BookISBN = xe.GetAttribute("ISBN").ToString();
bookModel.BookType = xe.GetAttribute("Type").ToString();
// 得到Book節(jié)點(diǎn)的所有子節(jié)點(diǎn)
XmlNodeList xnl0 = xe.ChildNodes;
bookModel.BookName = xnl0.Item(0).InnerText;
bookModel.BookAuthor = xnl0.Item(1).InnerText;
bookModel.BookPrice = Convert.ToDouble(xnl0.Item(2).InnerText);
bookModeList.Add(bookModel);
}
}
bookModeList.Add(new BookModel());
}
#endregion XmlDocument讀取
運(yùn)行結(jié)果如下:
使用XmlTextReader方式讀取
使用XmlTextReader讀取數(shù)據(jù)的時(shí)候,首先創(chuàng)建一個(gè)流,然后用read()方法來不斷的向下讀,根據(jù)讀取的結(jié)點(diǎn)的類型來進(jìn)行相應(yīng)的操作.如下:
#region XmlTextReaderDemo
public static void XmlTextReaderDemo()
{
XmlTextReader reader = new XmlTextReader(@"d:/demo.xml");
List<BookModel> modelList = new List<BookModel>();
BookModel model = new BookModel();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "book")
{
model.BookType = reader.GetAttribute("Type");
model.BookISBN = reader.GetAttribute("ISBN");
}
if (reader.Name == "title")
{
model.BookName = reader.ReadElementContentAsString();
}
if (reader.Name == "author")
{
model.BookAuthor = reader.ReadElementString().Trim();
}
if (reader.Name == "price")
{
model.BookPrice = Convert.ToDouble(reader.ReadElementString().Trim());
}
//for(int i=0;i<reader.AttributeCount;i++)
//{
// reader.MoveToAttribute(i);
//}
}
if (reader.NodeType == XmlNodeType.EndElement)
{
modelList.Add(model);
model = new BookModel();
}
}
reader.Close();
modelList.Add(new BookModel());
}
#endregion XmlTextReaderDemo
使用 Linq to Xml讀取
Linq是C#3.0中出現(xiàn)的一個(gè)新特性,使用它可以方便的操作許多數(shù)據(jù)源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比較簡(jiǎn)單。
必須引用using System.Linq;using System.Xml.Linq;
#region 讀取所有的數(shù)據(jù)
XElement xe = XElement.Load(@"d:/demoLinq.xml");
//xe.Descendants
var elements = from ele in xe.Elements()
select ele;
List<BookModel> modelList = new List<BookModel>();
foreach (var ele in elements)
{
BookModel model = new BookModel();
model.BookAuthor = ele.Element("author").Value;
model.BookName = ele.Element("title").Value;
model.BookPrice = Convert.ToDouble(ele.Element("price").Value);
model.BookISBN = ele.Attribute("ISBN").Value;
model.BookType = ele.Attribute("Type").Value;
modelList.Add(model);
}
modelList.Add(new BookModel());
#endregion 讀取所有的數(shù)據(jù)
總結(jié)
1.XmlDocument方法優(yōu)點(diǎn)是便于查找
2.XmlTextReader方法是流讀取內(nèi)存暫用少
3.Linq to Xml 最新方法也是推薦方法,代碼少易于理解
源碼下載:ConsoleApplication_jb51.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C# Fiddler插件實(shí)現(xiàn)網(wǎng)站離線瀏覽功能
欄 目:C#教程
下一篇:C# 泛型的約束
本文標(biāo)題:C#讀取XML的三種實(shí)現(xiàn)方式
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5914.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(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)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置


