在講了一系列的基礎文檔之後,現在開始講一些實例。對於一些數據不是很大的程式,或者只是一些配置文件,需要本地存儲的,完全可以使用XML代替資料庫,因為只是去操作單個文件會比操作資料庫要簡單很多,在程式中訪問和操作XML一般使用DOM(文檔對象模型)和流模式。DOM運行編輯和更新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的話會更加的靈活,其它的幾種操作方法有興趣的同學也可以直接研究。