1. 程式人生 > >C#中常用的幾種讀取XML檔案的方法

C#中常用的幾種讀取XML檔案的方法

 XML檔案是一種常用的檔案格式,例如WinForm裡面的app.config以及Web程式中的web.config檔案,還有許多重要的場所都有它的身影。Xml是Internet環境中跨平臺的,依賴於內容的技術,是當前處理結構化文件資訊的有力工具。XML是一種簡單的資料儲存語言,使用一系列簡單的標記描述資料,而這些標記可以用方便的方式建立,雖然XML佔用的空間比二進位制資料要佔用更多的空間,但XML極其簡單易於掌握和使用。微軟也提供了一系列類庫來倒幫助我們在應用程式中儲存XML檔案。

“在程式中訪問進而操作XML檔案一般有兩種模型,分別是使用DOM(文件物件模型)和流模型,使用DOM的好處在於它允許編輯和更新XML文件,可以隨機訪問文件中的資料,可以使用XPath查詢,但是,DOM的缺點在於它需要一次性的載入整個文件到記憶體中,對於大型的文件,這會造成資源問題。流模型很好的解決了這個問題,因為它對XML檔案的訪問採用的是流的概念,也就是說,任何時候在記憶體中只有當前節點,但它也有它的不足,它是隻讀的,僅向前的,不能在文件中執行向後導航操作。”具體參見在Visual C#中使用XML指南之讀取XML

下面我將介紹三種常用的讀取XML檔案的方法。分別是

   1:
使用 XmlDocument
   2: 使用 XmlTextReader
   3: 使用 Linq to Xml

這裡我先建立一個XML檔案,名為Book.xml下面所有的方法都是基於這個XML檔案的,檔案內容如下:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <bookstore>
   3:   <!--記錄書本的資訊-->
   4:   <book Type="必修課" ISBN="7-111-19149-2">
   5:     <
title>資料結構</title>
   6:     <author>嚴蔚敏</author>
   7:     <price>30.00</price>
   8:   </book>
   9:   <book Type="必修課" ISBN="7-111-19149-3">
  10:     <title>路由型與交換型網際網路基礎</title>
  11:     <author>程慶梅</author>
  12:     <price>
27.00</price>
  13:   </book>
  14:   <book Type="必修課" ISBN="7-111-19149-4">
  15:     <title>計算機硬體技術基礎</title>
  16:     <author>李繼燦</author>
  17:     <price>25.00</price>
  18:   </book>
  19:   <book Type="必修課" ISBN="7-111-19149-5">
  20:     <title>軟體質量保證與管理</title>
  21:     <author>朱少民</author>
  22:     <price>39.00</price>
  23:   </book>
  24:   <book Type="必修課" ISBN="7-111-19149-6">
  25:     <title>演算法設計與分析</title>
  26:     <author>王紅梅</author>
  27:     <price>23.00</price>
  28:   </book>
  29:   <book Type="選修課" ISBN="7-111-19149-1">
  30:     <title>計算機作業系統</title>
  31:     <author>7-111-19149-1</author>
  32:     <price>28</price>
  33:   </book>
  34: </bookstore>

為了方便讀取,我還定義一個書的實體類,名為BookModel,具體內容如下:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5:  
   6: namespace 使用XmlDocument
   7: {
   8:     public class BookModel
   9:     {
  10:         public BookModel()
  11:         { }
  12:         /// <summary>
  13:         /// 所對應的課程型別
  14:         /// </summary>
  15:         private string bookType;
  16:  
  17:         public string BookType
  18:         {
  19:             get { return bookType; }
  20:             set { bookType = value; }
  21:         }
  22:  
  23:         /// <summary>
  24:         /// 書所對應的ISBN號
  25:         /// </summary>
  26:         private string bookISBN;
  27:  
  28:         public string BookISBN
  29:         {
  30:             get { return bookISBN; }
  31:             set { bookISBN = value; }
  32:         }
  33:  
  34:         /// <summary>
  35:         /// 書名
  36:         /// </summary>
  37:         private string bookName;
  38:  
  39:         public string BookName
  40:         {
  41:             get { return bookName; }
  42:             set { bookName = value; }
  43:         }
  44:  
  45:         /// <summary>
  46:         /// 作者
  47:         /// </summary>
  48:         private string bookAuthor;
  49:  
  50:         public string BookAuthor
  51:         {
  52:             get { return bookAuthor; }
  53:             set { bookAuthor = value; }
  54:         }
  55:  
  56:         /// <summary>
  57:         /// 價格
  58:         /// </summary>
  59:         private double bookPrice;
  60:  
  61:         public double BookPrice
  62:         {
  63:             get { return bookPrice; }
  64:             set { bookPrice = value; }
  65:         }
  66:     }
  67: }

1.使用XmlDocument.

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

   1: xn 代表一個結點
   2: xn.Name;//這個結點的名稱
   3: xn.Value;//這個結點的值
   4: xn.ChildNodes;//這個結點的所有子結點
   5: xn.ParentNode;//這個結點的父結點
   6: .......
1.1 讀取所有的資料. 使用的時候,首先宣告一個XmlDocument物件,然後呼叫Load方法,從指定的路徑載入XML檔案.
   1: XmlDocument doc = new XmlDocument();
   2: doc.Load(@"..\..\Book.xml");

然後可以通過呼叫SelectSingleNode得到指定的結點,通過GetAttribute得到具體的屬性值.參看下面的程式碼

   1: // 得到根節點bookstore
   2: XmlNode xn = xmlDoc.SelectSingleNode("bookstore");
   3:  
   4:  
   5: // 得到根節點的所有子節點
   6: XmlNodeList xnl = xn.ChildNodes;
   7:  
   8: foreach (XmlNode xn1 in xnl)
   9: {
  10:     BookModel bookModel = new BookModel();
  11:     // 將節點轉換為元素,便於得到節點的屬性值
  12:     XmlElement xe = (XmlElement)xn1;
  13:     // 得到Type和ISBN兩個屬性的屬性值
  14:     bookModel.BookISBN = xe.GetAttribute("ISBN").ToString();
  15:     bookModel.BookType = xe.GetAttribute("Type").ToString();
  16:     // 得到Book節點的所有子節點
  17:     XmlNodeList xnl0 = xe.ChildNodes;
  18:     bookModel.BookName=xnl0.Item(0).InnerText;
  19:     bookModel.BookAuthor=xnl0.Item(1).InnerText;
  20:     bookModel.BookPrice=Convert.ToDouble(xnl0.Item(2).InnerText);
  21:     bookModeList.Add(bookModel);
  22: }
  23: dgvBookInfo.DataSource = bookModeList;

在正常情況下,上面的程式碼好像沒有什麼問題,但是對於讀取上面的XML檔案,則會出錯,原因就是因為我上面的XML檔案裡面有註釋,大家可以參看Book.xml檔案中的第三行,我隨便加的一句註釋.註釋也是一種結點型別,在沒有特別說明的情況下,會預設它也是一個結點(Node).所以在把結點轉換成元素的時候就會報錯."無法將型別為“System.Xml.XmlComment”的物件強制轉換為型別“System.Xml.XmlElement”。"

Snap2_thumb1

幸虧它裡面自帶了解決辦法,那就是在讀取的時候,告訴編譯器讓它忽略掉裡面的註釋資訊.修改如下:

   1: XmlDocument xmlDoc = new XmlDocument();
   2: XmlReaderSettings settings = new XmlReaderSettings();
   3: settings.IgnoreComments = true;//忽略文件裡面的註釋
   4: XmlReader reader = XmlReader.Create(@"..\..\Book.xml", settings);
   5: xmlDoc.Load(reader);

最後讀取完畢後,記得要關掉reader.

相關推薦

C#常用讀取XML檔案方法

 XML檔案是一種常用的檔案格式,例如WinForm裡面的app.config以及Web程式中的web.config檔案,還有許多重要的場所都有它的身影。Xml是Internet環境中跨平臺的,依賴於內容的技術,是當

淺談C++建構函式

3月中旬參加宣講會,做了X軟公司的C++筆試題,裡面有一道“預設拷貝建構函式的題”,由於好久沒複習C++基礎知識,當時連基本的概念都想不來了了。於是乎,開始拿起以前看的譚浩強C++複習起來,現在書快要要啃完了,覺得收穫頗多。好比練武功,祕籍雖然重要,但更重要的還

使用dom4j四讀取xml檔案方法

原文地址:http://blog.163.com/chenhui_java/blog/static/172672494201092632424462/ 以下是四種讀取xml檔案的方式,每種都有自己的用處。這是我在寫日誌管理器的時候查詢到的。希望能給大家幫助 首先我們先給出一個

C++建構函式

看了大神的部落格,感覺很厲害,果斷轉了 C++中的建構函式 C++中的建構函式可以分為4類: (1)預設建構函式。以Student類為例,預設建構函式的原型為 Student();//沒有引數 (2)初始化建構函式 Student(int num,int age)

qt 開發過程使用DOM方式讀取XML檔案

本來沒打算記錄這個過程,QT讀取XML的方法,網上相關的博文很多,也比我的詳細,我也是參考其他大神的,但是在這過程中涉及檔案路徑操作,讓我費了點周折, 畢竟初學QT,很多不熟悉的地方。 我將XML以絕對路徑操作成功後(XML檔案內容很簡單,所有讀取這個XML也不難)想實現

c++函數調用約定(轉)

standard amp 可見 代碼 return ext 只有一個 highlight 定義 C++中的函數調用約定主要針對三個問題: 1、參數傳遞的方式(是否采用寄存器傳遞參數、采用哪個寄存器傳遞參數、參數壓桟的順序等); 2、函數調用結束後的棧指針由誰恢復(被調用

配置properties檔案方法--SSM框架-附原始碼

背景:  Spring、SpringMVC4.0.2、Mybatis3.2.6、JDK1.8、tomcat8、maven3.3.9、MyEclipse2013 專案結構:   demo.properties:  方法一: springmvc.xml

1.3 AndroidUI排布方法介紹

關於XML基本語法介紹和XML語法總結可以參考這裡:XML基本語法介紹、XML語法總結。 在Android中,提供了一種非常簡單、方便的方法用於控制UI介面。該方法採用XML檔案來進行介面佈局,從而將佈局介面的程式碼和邏輯控制的Java程式碼分離開

讀大檔案方法的效率對比測試

說明: 1、首先呼叫了 generateBigFile() 生成一個大的txt 檔案 a.txt,大小是 1.88G 。 package com.other.test1; import java.io.BufferedReader; import java.io.Fi

iOS 延遲呼叫的方法

 performSelector方法     執行方法:     [self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<#(NSTimeInterval)

Spark ML包歸一化方法總結

org.apache.spark.ml.feature包中包含了4種不同的歸一化方法: Normalizer StandardScaler MinMaxScaler MaxAbsScaler 有時感覺會容易混淆,藉助官方文件和實際資料的變換,在這裡做一次

QT讀取XML檔案方式 的例項

第一部分:QXmlStreamReader XML(eXtensible Markup Language)是一種通用的文字格式,被廣泛運用於資料交換和資料儲存(雖然近年來 JSON 盛行,大有取代 XML 的趨勢,但是對於一些已有系統和架構,比如 WebService,由於歷史原因,仍舊會繼

C#建立和讀取XML檔案

專案中需要將前臺頁面中的資訊儲存下來並存儲為xml檔案格式到資料庫中去。因此我先在這裡通過一個小例項來學習xml的建立與讀取。 1.建立簡單的XML檔案 為了便於測試,我們首先建立控制檯應用程式,專案命名為CreateXml,Program.cs程式碼如下: u

在用c++讀取xml檔案時,執行時出現以下錯誤:出現未處理的“System.Xml.XmlException”型別的異常出現在 system.xml.dll

各位高手,我剛剛開始接觸c++,使用的是Microsoft Visual Studio 2003版本,在使用c++讀取xml檔案時,編譯已經通過,但是執行.exe程式時,老是出現這個錯誤:“未處理的“System.Xml.XmlException”型別的異常出現在 syste

c#讀取xml檔案到datagridview

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

C++讀取資料的函式的用法

程式碼編譯執行環境:VS2012+Win32+Debug。(我用Eclipse也跑過一遍了) 1.cin簡介 cin是C++程式語言中的標準輸入流物件,即istream類的物件。cin主要用於從標準輸入讀取資料,這裡的標準輸入,指的是終端的鍵盤。此外,cout是流的物件,即ostream類的物件,cerr是

C++使用libxml2讀取xml檔案

linux下,純c++使用libxml2讀取xml檔案 下載libxml2 [url]ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz[/url] 常規方法進行安裝 #tar xvzf libxml2-xx

關於Java集合類庫常用隊列

rac syn text 刪除 style asdasd 新元素 其他 arraylist Java中幾種常用的隊列 阻塞隊列與普通隊列的區別在於,當隊列是空的時,從隊列中獲取元素的操作將會被阻塞,或者當隊列是滿時,往隊列裏添加元素的操作會被阻塞。試圖從空的阻塞隊列中獲取元

認識C#語言循環命令

計算 依次 進行 結束 功能 if判斷 char ase do while if判斷 書寫格式: if(條件1){ 代碼1}                  else if(條件2){ 代碼2}e

兄弟連學Python----CSS常用選擇器

元素選擇器 類選擇器 範圍 命名沖突 post ora before 重復 -- Css選擇器 常用的選擇器有如下幾種: 1、標簽選擇器 標簽選擇器,此種選擇器影響範圍大,建議盡量應用在層級選擇器中。 舉例: *{margin:0;padding:0} div{c