首頁  >  文章  >  後端開發  >  C#讀取XML的三種實作方式的程式碼詳解

C#讀取XML的三種實作方式的程式碼詳解

黄舟
黄舟原創
2017-03-06 11:14:042556瀏覽

XML檔案是常用的檔案格式,本篇文章主要介紹了C#讀取XML的三種實作方式,主要是XmlDocument、XmlTextReader、Linq to Xml,有興趣的可以了解一下。

前言

XML檔案是常用的檔案格式,例如WinForm裡面的app.config以及Web程式中的web.config文件,還有許多重要的場所都有它的身影。 (類似還有Json)微軟也提供了一系列類別庫來倒幫助我們在應用程式中儲存XML檔案

在程式中存取進而操作XML檔案一般有兩種模型:

DOM(文檔物件模型):使用DOM的好處在於它允許編輯和更新XML文檔,可以隨機存取文檔中的數據,可以使用XPath查詢,但是,DOM的缺點是它需要一次性的載入整個文檔到記憶體中,對於大型的文檔,這會造成資源問題。

流模型:流模型很好的解決了這個問題,因為它對XML檔案的存取採用的是流的概念,也就是說,任何時候在記憶體中只有當前節點,但它也有它的不足,它是唯讀的,僅向前的,不能在文件中執行向後導航操作。

C#中三種讀取XML檔案方法如下:

#1.使用XmlDocument(DOM模式)

##2 .使用XmlTextReader(流模式)


3.使用Linq to Xml(Linq模式)

使用XmlDocument方式讀取

使用XmlDocument是一種基於文件結構模型的方式來讀取XML檔.在XML檔中,我們可以把XML看作是由文件宣告(Declare),元素(Element),屬性(Attribute) ,文本(Text)等構成的一個樹.最開始的一個結點叫作根結點,每個結點都可以有自己的子結點.得到一個結點後,可以透過一系列屬性或方法得到這個結點的值或其它的一些屬性.例如:


xn 代表一个结点
xn.Name;//这个结点的名称
xn.Value;//这个结点的值
xn.ChildNodes;//这个结点的所有子结点
xn.ParentNode;//这个结点的父结点

讀取所有資料

#使用的時候,先宣告一個XmlDocument物件,然後呼叫Load方法,從指定的路徑載入XML檔.


BookModel是圖書模型


#region XmlDocument读取

public static void XmlDocumentReadDemo()
{
  //list
  List<BookModel> bookModeList = new List<BookModel>();

  //使用的时候,首先声明一个XmlDocument对象,然后调用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");
    //然后可以通过调用SelectSingleNode得到指定的结点,通过GetAttribute得到具体的属性值.参看下面的代码
    // 得到根节点bookstore
    XmlNode xn = doc.SelectSingleNode("bookstore");
    // 得到根节点的所有子节点
    XmlNodeList xnl = xn.ChildNodes;

    foreach (XmlNode xn1 in xnl)
    {
      BookModel bookModel = new BookModel();
      // 将节点转换为元素,便于得到节点的属性值
      XmlElement xe = (XmlElement)xn1;
      // 得到Type和ISBN两个属性的属性值
      bookModel.BookISBN = xe.GetAttribute("ISBN").ToString();
      bookModel.BookType = xe.GetAttribute("Type").ToString();
      // 得到Book节点的所有子节点
      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读取

運行結果如下:

 

# 使用XmlTextReader方式讀取

#使用XmlTextReader讀取資料的時候,先建立一個流,然後用read()方法來不斷的向下讀,根據讀取的結點的類型來進行對應的操作.如下:


#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中出現的新特性,使用它可以方便的操作許多資料來源,也包括XML檔.使用Linq操作XML檔非常的方便,而且也比較簡單。


必須引用using System.Linq;using System.Xml.Linq;


#region 读取所有的数据

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 读取所有的数据

 總結

1.XmlDocument方法優點是方便找出

2.XmlTextReader方法是流讀取記憶體暫用少

#3.Linq to Xml 最新方法也是推薦方法,程式碼少容易理解

以上就是C#讀取XML的三種實作方式的程式碼詳解的內容,更多相關內容請關注PHP中文網(www.php.cn) !


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn