国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#讀取XML的三種實(shí)現(xiàn)方式

2020-01-24 00:46:13
字體:
供稿:網(wǎng)友

前言

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 XmlTextReaderDemopublic 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.Descendantsvar 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í)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 田林县| 南阳市| 樟树市| 喀喇沁旗| 观塘区| 察哈| 五家渠市| 班玛县| 南城县| 田林县| 云霄县| 永仁县| 肃北| 辽源市| 沾化县| 昭平县| 黄冈市| 灵川县| 安远县| 广德县| 海盐县| 大丰市| 抚松县| 冕宁县| 衡山县| 互助| 新郑市| 永清县| 望城县| 博野县| 繁昌县| 宜丰县| 汕头市| 东光县| 石城县| 岱山县| 元朗区| 鹿邑县| 陇南市| 宜州市| 阜平县|