欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年02月11日 10:56:55   作者:WindyAmy  
XML文件是一種常用的文件格式,本篇文章主要介紹了C#讀取XML的三種實(shí)現(xiàn)方式,主要是XmlDocument、XmlTextReader、Linq to Xml,有興趣的可以了解一下。

前言

XML文件是一種常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,還有許多重要的場(chǎng)所都有它的身影。(類(lèi)似還有Json)微軟也提供了一系列類(lèi)庫(kù)來(lái)倒幫助我們?cè)趹?yīng)用程序中存儲(chǔ)XML文件

在程序中訪(fǎng)問(wèn)進(jìn)而操作XML文件一般有兩種模型:

DOM(文檔對(duì)象模型):使用DOM的好處在于它允許編輯和更新XML文檔,可以隨機(jī)訪(fǎng)問(wèn)文檔中的數(shù)據(jù),可以使用XPath查詢(xún),但是,DOM的缺點(diǎn)在于它需要一次性的加載整個(gè)文檔到內(nèi)存中,對(duì)于大型的文檔,這會(huì)造成資源問(wèn)題。

流模型:流模型很好的解決了這個(gè)問(wèn)題,因?yàn)樗鼘?duì)XML文件的訪(fǎng)問(wèn)采用的是流的概念,也就是說(shuō),任何時(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)模型的方式來(lái)讀取XML文件.在XML文件中,我們可以把XML看作是由文檔聲明(Declare),元素(Element),屬性(Attribute),文本(Text)等構(gòu)成的一個(gè)樹(shù).最開(kāi)始的一個(gè)結(jié)點(diǎn)叫作根結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都可以有自己的子結(jié)點(diǎn).得到一個(gè)結(jié)點(diǎn)后,可以通過(guò)一系列屬性或方法得到這個(gè)結(jié)點(diǎn)的值或其它的一些屬性.例如:

xn 代表一個(gè)結(jié)點(diǎn)
xn.Name;//這個(gè)結(jié)點(diǎn)的名稱(chēng)
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是圖書(shū)模型

#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");
    //然后可以通過(guò)調(diào)用SelectSingleNode得到指定的結(jié)點(diǎn),通過(guò)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()方法來(lái)不斷的向下讀,根據(jù)讀取的結(jié)點(diǎn)的類(lèi)型來(lái)進(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實(shí)現(xiàn)PDF合并的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)PDF合并的項(xiàng)目實(shí)踐

    有時(shí)我們可能會(huì)遇到需要的資料或教程被分成了幾部分存放在多個(gè)PDF文件中,本文主要介紹了C#實(shí)現(xiàn)PDF合并的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C#創(chuàng)建簡(jiǎn)單windows窗體應(yīng)用(加法器)

    C#創(chuàng)建簡(jiǎn)單windows窗體應(yīng)用(加法器)

    這篇文章主要為大家詳細(xì)介紹了C#創(chuàng)建一個(gè)簡(jiǎn)單windows窗體應(yīng)用的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • c#高效比對(duì)大量圖片的實(shí)例代碼

    c#高效比對(duì)大量圖片的實(shí)例代碼

    以前傳統(tǒng)的比較方式是遍歷圖片中的每一個(gè)像素,然后進(jìn)行比對(duì)。這樣的比對(duì)在少量圖片的比對(duì)上雖然效率低一點(diǎn),但是也沒(méi)有什么不好。但是在大量圖片比對(duì)的時(shí)候,過(guò)長(zhǎng)的反應(yīng)時(shí)間和對(duì)服務(wù)器比較高的消耗肯定是不行的,下面介紹下新的方法
    2013-10-10
  • 使用HttpHanlder處理404:File not found的問(wèn)題

    使用HttpHanlder處理404:File not found的問(wèn)題

    本篇文章小編為大家介紹。使用HttpHanlder處理404:File not found的問(wèn)題。需要的朋友參考下
    2013-04-04
  • Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描

    Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C# Winform中如何繪制動(dòng)畫(huà)示例詳解

    C# Winform中如何繪制動(dòng)畫(huà)示例詳解

    這篇文章主要給大家介紹了關(guān)于C# Winform中如何繪制動(dòng)畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C# Winform具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#利用雪花算法實(shí)現(xiàn)生成ID工具類(lèi)

    C#利用雪花算法實(shí)現(xiàn)生成ID工具類(lèi)

    雪花算法表示生成的ID如雪花般獨(dú)一無(wú)二,該算法源自Twitter,主要用于解決分布式系統(tǒng)的唯一Id生成問(wèn)題,本文主要介紹了C#如何利用利用雪花算法實(shí)現(xiàn)生成ID,需要的可以參考下
    2023-12-12
  • 使用VS2010 C#開(kāi)發(fā)ActiveX控件(下),完整代碼打包下載

    使用VS2010 C#開(kāi)發(fā)ActiveX控件(下),完整代碼打包下載

    我們介紹了開(kāi)發(fā)、打包、發(fā)布、使用ActiveX控件的全過(guò)程。在演示程序中,我們沒(méi)有調(diào)用串口通信和讀卡器Dll程序,由于我們讀卡器的原始Dll是使用其它語(yǔ)言進(jìn)行開(kāi)發(fā)的,對(duì)C#來(lái)說(shuō),是非托管代碼,因此我們還需要在代碼級(jí)別進(jìn)行非托管代碼的安全性設(shè)置
    2011-05-05
  • C#中StringBuilder類(lèi)的使用總結(jié)

    C#中StringBuilder類(lèi)的使用總結(jié)

    本篇文章主要是對(duì)C#中StringBuilder類(lèi)的使用方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#實(shí)現(xiàn)終止正在執(zhí)行的線(xiàn)程

    C#實(shí)現(xiàn)終止正在執(zhí)行的線(xiàn)程

    這篇文章主要介紹了C#實(shí)現(xiàn)終止正在執(zhí)行的線(xiàn)程的方法,針對(duì)臨界資源等容易出現(xiàn)錯(cuò)誤的地方進(jìn)行了分析,并提出了改進(jìn)方案與實(shí)例,需要的朋友可以參考下
    2014-09-09

最新評(píng)論