C#基礎知識-XML介紹及基本操作(十)


在講了一系列的基礎文檔之后,現在開始講一些實例。對於一些數據不是很大的程序,或者只是一些配置文件,需要本地存儲的,完全可以使用XML代替數據庫,因為只是去操作單個文件會比操作數據庫要簡單很多,在程序中訪問和操作XML一般使用DOM(文檔對象模型)和流模式。DOM運行編輯和更新XML文檔,可以隨機訪問文檔中的數據,但有一個缺點,就是在加載XML的時候是會吧整個文檔的加載進內存中。流模式很好的解決了這個問題,在對XML文件訪問采用的是流的概念,任何時候在內存中只有當前接口,不足的地方是它是只讀的,僅向前,不能再文檔中去向后編輯增加。

XML(Extensible Markup Language)可擴展的標記語言,XML和HTML有很多地方都非常的類似,但HTML的語法不夠嚴密,很松散,很多的格式沒有強制的要求所以尤其在處理瀏覽器兼容的問題上需要費很大的心思啊,我特別有體會,很多不同的網站系統對瀏覽器就有要求,標准不統一,所以電腦上谷歌、火狐、360…..一大堆的瀏覽器就是為了適應不同的網站兼容的問題,XML有着嚴格的格式要求,比如要求元素必須是一對對顯示的,XML還有一個很重要的特性就是通用性高,很多的程序包括Web和App底層數據交換都是轉換成XML來進行數據交換的。

 

下面來看一個簡單的XML文檔:

 1 <?xml version="1.0" encoding="utf-8" standalone=”yes”?>
 2 
 3 <!—下面是學生名單-->
 4 
 5 <學生名單>
 6 
 7   <學生  id=”1”>
 8 
 9     <學號>201701</學號>
10 
11 <姓名>張三三</姓名>
12 
13 <班級>0102</班級>
14 
15   </學生>
16 
17   <學生  id=”2”>
18 
19     <學號>201702</學號>
20 
21 <姓名>李四四</姓名>
22 
23 <班級>0102</班級>
24 
25   </學生>
26 
27   <學生  id=”3”>
28 
29     <學號>201703</學號>
30 
31 <姓名>王五五</姓名>
32 
33 <班級>0103</班級>
34 
35   </學生>
36 
37 </學生名單>

 

1.文檔頭部聲明:

<?xml version="1.0" encoding="utf-8" ?>

?XML標記說明它是一個XML文檔,version為版本號,encoding屬性表明是編碼格式為”utf-8”,standalone取”yes”時,表明該文件未引用其它外部文件。

 

2.注釋:

<!--下面是學生名單-->

   注釋的格式和html類似:<!--“注釋的內容”-->,使用注釋時需要注意:1.注釋不可以出現在XML聲明之前.2.注釋中不可以出現”--”字符,如:<!--下面是學生--名單> 3.注釋不可以嵌套.

 

3.根元素:

<學生名單>  XXX  </學生名單>

每個文檔必須有有一個根元素,沒有根元素將會在解析的時候出現錯誤

 

4.元素(標記),是XML中用來定義數據的一個基本的單位,元素是由標記要定義的,同時標記分為非空標記和空標記:

 

(1)非空標記

<學號>201701</學號>

<姓名>張三三</姓名>

<班級>0102</班級>

非空即當標記中包含有內容,格式為:<標記>內容<標記>

(2)空標記

<學生 id=”1”></學生>

空標記中只有屬性,兩個標簽中的內容是為空的。

 

XML位於System.Xml命名空間,以下為XML結構列表:

標 記

描 述

XmlDocument

XML文檔

XmlNode

XML中單個的節點,如<學生名單>

XmlAttribute

XML元素中的屬性

XmlText

表示元素或屬性的文本內容

XmlElement

最小元素,如<姓名>張三三</姓名>

XmlComment

表示XML注釋的內容

XmlDeclaration

XML文檔第一行的聲明

 

 

 

 

 

 

 

 

 

 

 

 

XML文檔的創建

最終效果:

<?xml version="1.0" encoding="UTF-8"?>

<學生名單>

  <學生 id="1">

    <姓名>張三三</姓名>

  </學生>

</學生名單>

代碼:

 1 //創建一個XML文檔對象
 2 
 3 XmlDocument doc = new XmlDocument();
 4 
 5 //聲明XML頭部信息
 6 
 7 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
 8 
 9 //添加進doc對象子節點
10 
11 doc.AppendChild(dec);
12 
13 //創建根節點
14 
15 XmlElement root = doc.CreateElement("學生名單");
16 
17 doc.AppendChild(root);
18 
19  
20 
21 //再創建根節點下的子節點
22 
23 XmlElement student = doc.CreateElement("學生");
24 
25 //設置子節點屬性
26 
27 student.SetAttribute("id", "1");
28 
29 //子節點下再創建標記
30 
31 XmlElement studentName = doc.CreateElement("姓名");
32 
33 //<姓名>的內容
34 
35 XmlText xmlText = doc.CreateTextNode("張三三");
36 
37 //將內容添加到<姓名>標記
38 
39 studentName.AppendChild(xmlText);
40 
41 //再將<姓名>標記添加到<學生>標記的子節點下
42 
43 student.AppendChild(studentName);
44 
45 //最后把<學生>標記添加到根節點<學生名單>子節點下
46 
47 root.AppendChild(student);
48 
49 //doc文檔對象保存寫入
50 
51 doc.Save("Student.xml");

 

 XML文檔的讀取

C#中XML讀取有三種方式,XmlDocument,XmlTextReader,Linq to Xml,這幾種方式中我個人習慣是用Linq,因為Linq去讀取、篩選都會很方便,但是由於還沒有寫關於Linq的文章,這里我們使用XmlDocument的方式。

 1 XmlDocument doc = new XmlDocument();
 2 
 3 //加載根目錄下XML文件
 4 
 5 doc.Load("XMLFile1.xml");
 6 
 7 //獲取根節點
 8 
 9 XmlElement root = doc.DocumentElement;
10 
11 //獲取<學生>子節點
12 
13 XmlNodeList personNodes = root.GetElementsByTagName("學生");
14 
15 //使用foreach循環讀出集合
16 
17 foreach (XmlNode node in personNodes)
18 
19 {
20 
21     string id = ((XmlElement)node).GetAttribute("id");
22 
23     string name = ((XmlElement)node).GetElementsByTagName("姓名")[0].InnerText;
24 
25     string number = ((XmlElement)node).GetElementsByTagName("學號")[0].InnerText;
26 
27     string _class = ((XmlElement)node).GetElementsByTagName("班級")[0].InnerText;
28 
29     Console.WriteLine("學生Id:{0},姓名:{1},學號:{2},班級:{3}", id, name, number, _class);
30 
31 }
32 
33 Console.ReadKey();

 

 增加

 

 1 string  xmlPath = "XMLFile1.xml";
 2 
 3 XmlDocument doc = new XmlDocument();
 4 
 5 //加載根目錄下XML文件
 6 
 7 doc.Load(xmlPath);
 8 
 9 //獲取根節點
10 
11 XmlElement root = doc.DocumentElement;
12 
13  
14 
15 XmlElement student = doc.CreateElement("學生");
16 
17 student.SetAttribute("id", "4");
18 
19 //添加姓名標記
20 
21 XmlElement studentName = doc.CreateElement("姓名");
22 
23 XmlText xmlText = doc.CreateTextNode("小明");
24 
25 studentName.AppendChild(xmlText);
26 
27 //添加學號標記
28 
29 XmlElement studentNumber = doc.CreateElement("學號");
30 
31 XmlText xmlText2 = doc.CreateTextNode("201704");
32 
33 studentNumber.AppendChild(xmlText2);
34 
35 //添加班級標記
36 
37 XmlElement studentClass = doc.CreateElement("班級");
38 
39 XmlText xmlText3 = doc.CreateTextNode("0102");
40 
41 studentClass.AppendChild(xmlText3);
42 
43  
44 
45 //將上面創建的標記添加到<學生>標記
46 
47 student.AppendChild(studentName);
48 
49 student.AppendChild(studentNumber);
50 
51 student.AppendChild(studentClass);
52 
53  
54 
55 //將上面創建的標記添加到<學生名單>根標記
56 
57 root.AppendChild(student);
58 
59  
60 
61 //最后一步不要忘記了保存
62 
63 doc.Save(xmlPath);

 

 

 

 

修改

 1 string  xmlPath = "XMLFile1.xml";
 2 
 3 XmlDocument doc = new XmlDocument();
 4 
 5 doc.Load(xmlPath);
 6 
 7 XmlElement root = doc.DocumentElement;
 8 
 9 //篩選出符合條件的標記
10 
11 XmlElement selectEle = (XmlElement)root.SelectSingleNode("/學生名單/學生[@id='4']");
12 
13 //獲取該標記下的子元素
14 
15 XmlElement nameEle = (XmlElement)selectEle.GetElementsByTagName("姓名")[0];
16 
17 //修改<姓名>標記中的內容
18 
19 nameEle.InnerText = "大明";
20 
21 //還是那句話不要忘記保存
22 
23 doc.Save(xmlPath);

 

  

 刪除標記

  刪除和修改類似,也是篩選出符合條件的標記,然后移除 

 1 string  xmlPath = "XMLFile1.xml";
 2 
 3 XmlDocument doc = new XmlDocument();
 4 
 5 doc.Load(xmlPath);
 6 
 7 XmlElement root = doc.DocumentElement;
 8 
 9 //篩選出符合條件的標記
10 
11 XmlElement selectEle = (XmlElement)root.SelectSingleNode("/學生名單/學生[@id='4']");
12 
13 //刪除指定子元素
14 
15 root.RemoveChild(selectEle);
16 
17 //還是那句話不要忘記保存
18 
19 doc.Save(xmlPath);

 


以上就是XML基本的操作方法,當然如果使用Linq to Xml的話會更加的靈活,其它的幾種操作方法有興趣的同學也可以直接研究。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM