C#讀取XML的三種實現(xiàn)方式
前言
XML文件是一種常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,還有許多重要的場所都有它的身影。(類似還有Json)微軟也提供了一系列類庫來倒幫助我們在應(yīng)用程序中存儲XML文件
在程序中訪問進(jìn)而操作XML文件一般有兩種模型:
DOM(文檔對象模型):使用DOM的好處在于它允許編輯和更新XML文檔,可以隨機(jī)訪問文檔中的數(shù)據(jù),可以使用XPath查詢,但是,DOM的缺點在于它需要一次性的加載整個文檔到內(nèi)存中,對于大型的文檔,這會造成資源問題。
流模型:流模型很好的解決了這個問題,因為它對XML文件的訪問采用的是流的概念,也就是說,任何時候在內(nèi)存中只有當(dāng)前節(jié)點,但它也有它的不足,它是只讀的,僅向前的,不能在文檔中執(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)成的一個樹.最開始的一個結(jié)點叫作根結(jié)點,每個結(jié)點都可以有自己的子結(jié)點.得到一個結(jié)點后,可以通過一系列屬性或方法得到這個結(jié)點的值或其它的一些屬性.例如:
xn 代表一個結(jié)點 xn.Name;//這個結(jié)點的名稱 xn.Value;//這個結(jié)點的值 xn.ChildNodes;//這個結(jié)點的所有子結(jié)點 xn.ParentNode;//這個結(jié)點的父結(jié)點
讀取所有數(shù)據(jù)
使用的時候,首先聲明一個XmlDocument對象,然后調(diào)用Load方法,從指定的路徑加載XML文件.
BookModel是圖書模型
#region XmlDocument讀取 public static void XmlDocumentReadDemo() { //list List<BookModel> bookModeList = new List<BookModel>(); //使用的時候,首先聲明一個XmlDocument對象,然后調(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é)點,通過GetAttribute得到具體的屬性值.參看下面的代碼 // 得到根節(jié)點bookstore XmlNode xn = doc.SelectSingleNode("bookstore"); // 得到根節(jié)點的所有子節(jié)點 XmlNodeList xnl = xn.ChildNodes; foreach (XmlNode xn1 in xnl) { BookModel bookModel = new BookModel(); // 將節(jié)點轉(zhuǎn)換為元素,便于得到節(jié)點的屬性值 XmlElement xe = (XmlElement)xn1; // 得到Type和ISBN兩個屬性的屬性值 bookModel.BookISBN = xe.GetAttribute("ISBN").ToString(); bookModel.BookType = xe.GetAttribute("Type").ToString(); // 得到Book節(jié)點的所有子節(jié)點 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讀取
運行結(jié)果如下:
使用XmlTextReader方式讀取
使用XmlTextReader讀取數(shù)據(jù)的時候,首先創(chuàng)建一個流,然后用read()方法來不斷的向下讀,根據(jù)讀取的結(jié)點的類型來進(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)的一個新特性,使用它可以方便的操作許多數(shù)據(jù)源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比較簡單。
必須引用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)點是便于查找
2.XmlTextReader方法是流讀取內(nèi)存暫用少
3.Linq to Xml 最新方法也是推薦方法,代碼少易于理解
源碼下載:ConsoleApplication_jb51.rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#讀取XML的CDATA節(jié)點內(nèi)容實例詳解
- C#實現(xiàn)XML文件讀取
- c#讀取XML多級子節(jié)點
- C# 創(chuàng)建,讀取,寫入XML文件
- 詳解c#讀取XML的實例代碼
- C#中如何使用 XmlReader 讀取XML文件
- C# winfrom實現(xiàn)讀取修改xml
- 詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法
- C#保存與讀取DataTable信息到XML格式的方法
- C#讀取xml節(jié)點數(shù)據(jù)方法小結(jié)
- C#從文件流讀取xml文件到DataSet并顯示的方法
- C#讀取Excel并轉(zhuǎn)化成XML的方法
- c# 讀取XML文件的示例
相關(guān)文章
C#創(chuàng)建簡單windows窗體應(yīng)用(加法器)
這篇文章主要為大家詳細(xì)介紹了C#創(chuàng)建一個簡單windows窗體應(yīng)用的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03使用HttpHanlder處理404:File not found的問題
本篇文章小編為大家介紹。使用HttpHanlder處理404:File not found的問題。需要的朋友參考下2013-04-04使用VS2010 C#開發(fā)ActiveX控件(下),完整代碼打包下載
我們介紹了開發(fā)、打包、發(fā)布、使用ActiveX控件的全過程。在演示程序中,我們沒有調(diào)用串口通信和讀卡器Dll程序,由于我們讀卡器的原始Dll是使用其它語言進(jìn)行開發(fā)的,對C#來說,是非托管代碼,因此我們還需要在代碼級別進(jìn)行非托管代碼的安全性設(shè)置2011-05-05