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模式)
使用XmlDocument方式讀取
使用XmlDocument是一種基於文件結構模型的方式來讀取XML檔.在XML檔中,我們可以把XML看作是由文件宣告(Declare),元素(Element),屬性(Attribute) ,文本(Text)等構成的一個樹.最開始的一個結點叫作根結點,每個結點都可以有自己的子結點.得到一個結點後,可以透過一系列屬性或方法得到這個結點的值或其它的一些屬性.例如:xn 代表一个结点 xn.Name;//这个结点的名称 xn.Value;//这个结点的值 xn.ChildNodes;//这个结点的所有子结点 xn.ParentNode;//这个结点的父结点
讀取所有資料
#使用的時候,先宣告一個XmlDocument物件,然後呼叫Load方法,從指定的路徑載入XML檔.#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檔非常的方便,而且也比較簡單。#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) !