1. 程式人生 > >C# XML檔案的一些操作(XmlDocument、XmlElement、XmlNode)

C# XML檔案的一些操作(XmlDocument、XmlElement、XmlNode)

C#操作xml主要有這麼幾個物件:XmlDocument、XmlElement、XmlNode

名稱空間:

using System.Xml;

知識補充:

XmlNode和XmlElement的區別:

1、Element是一個小範圍的定義,必須含有完整資訊的節點才能叫做元素。

2、Node是基本物件,Attribute、Element、Text等都是Node的子物件。

一個元素一定是一個節點,而一個節點不一定是元素。

XmlElement與XmlNode之間的繼承關係如下:

體現在屬性和方法中:

XmlNode有屬性 - ChildNodes(XmlNodeList型別),而XmlElement則沒有

XmlElement有方法 - GetAttribute、SetAttribute()等方法,而XmlNode則沒有

(注意:兩者都有Attribute屬性

因此,有些時候需要進行兩者間的轉換,以實現不同的功能。

主要方法以及屬性介紹:

(1)  XmlDocument::CreateElement():建立 XmlElement

有一個引數,兩個引數,三個引數三種過載,引數型別均為string

一個引數:CreateElement("元素名稱")

兩個引數:CreateElement("元素名稱","元素的名稱空間")

三個引數:CreateElement("元素的字首","元素的名稱","元素的名稱空間")

(2) XmlDocument::SelectSingleNode():選擇匹配 XPath 表示式的第一個 XmlNode

public XmlNode SelectSingleNode(
	string xpath
)

(3) XmlDocument::Save():將 XML 文件儲存到指定的位置

(4) XmlDocument::Load():載入指定的 XML 資料

(5)  XmlDocument::DocumentElement:獲取文件的根 XmlElement

(6)  XmlElement::SetAttribute():設定具有指定名稱的屬性的值

相對的有:GetAttribute():獲取具有指定名稱的屬性的值

(7) XmlNode::AppendChild():將指定的節點新增到該節點的子節點列表的末尾

XmlElement也繼承了該方法

(8) XmlNode::GetEnumerator():提供對XmlNode中節點上“for each”樣式迭代的支援。

同樣,XmlElement也繼承了該方法,所以也可用於"for each"迭代

例項程式碼:

XML文件的幾個簡單操作:

最終實現的XML內容如下所示:


其中:

“user”是xml檔案的根節點;

兩個"person"節點是"user"節點的子節點;

"person"節點有三個屬性:"name", "sex", "age";

"pass"和"address"是"person"節點的兩個子節點

(1) 增加宣告段落:

  1. XmlDocument xmldoc = new XmlDocument();  
  2. //加入XML的宣告段落,<?xmlversion="1.0" encoding="gb2312"?>
  3. XmlDeclaration xmldecl;  
  4. xmldecl = xmldoc.CreateXmlDeclaration("1.0","gb2312"null);  
  5. xmldoc.AppendChild(xmldecl);  

(2) 加入根元素

  1. privatevoid CreateRootElement()  
  2. {  
  3.     xmlDoc = new XmlDocument();  
  4.     XmlElement xmlelem = xmlDoc.CreateElement("user");  
  5.     xmlDoc.AppendChild(xmlelem);  
  6.     //儲存建立好的XML文件
  7.     xmlDoc.Save("User.xml");  
  8. }  

(3) 裝載XML檔案

  1. //load xml file 
  2. privatevoid LoadXml()   
  3. {  
  4.     if (isFileExisted == false)  
  5.     {  
  6.         xmlDoc = new XmlDocument();  
  7.         CreateRootElement();  
  8.         isFileExisted = true;  
  9.         return;  
  10.     }  
  11.     xmlDoc=new XmlDocument();  
  12.     xmlDoc.Load("User.xml");  
  13. }  
(4) 增加新元素
  1. //新增節點 
  2. publicvoid AddElement(string name, string sex, string age, string pass, string address)   
  3. {  
  4.     //裝載Xml檔案
  5.     LoadXml();  
  6.     //獲取根節點
  7.     XmlNode xmldocSelect = xmlDoc.SelectSingleNode("user");  
  8.     //建立元素Person
  9.     XmlElement personElement = xmlDoc.CreateElement("person");  
  10.     //person節點的三個屬性
  11.     personElement.SetAttribute("name", name);  
  12.     personElement.SetAttribute("sex", sex);  
  13.     personElement.SetAttribute("age", age);  
  14.     //建立一個新的元素
  15.     XmlElement passElement=xmlDoc.CreateElement("pass");   
  16.     //設定節點的串聯值
  17.     passElement.InnerText = pass;  
  18.     //將新建立的節點pass新增為person節點的子節點
  19.     personElement.AppendChild(passElement);  
  20.     XmlElement addrElement=xmlDoc.CreateElement("Address");  
  21.     addrElement.InnerText = address;  
  22.     personElement.AppendChild(addrElement);  
  23.     //新增person節點
  24.     xmldocSelect.AppendChild(personElement);  
  25.     xmlDoc.Save("user.xml");   
  26. }  
(5) 輸出xml文件內容:

(用了兩種遍歷方式:XmlNode,XmlElement)

  1. //輸出xml文件
  2. publicvoid showXml()  
  3. {  
  4.     LoadXml();  
  5.     //獲取根節點
  6.     XmlElement rootElement = xmlDoc.DocumentElement;  
  7.     //挨個查詢其下的子節點
  8.     foreach (XmlElement childElement in rootElement)  
  9.     {  
  10.         //分別輸出子節點屬性
  11.         Console.WriteLine(childElement.GetAttribute("name"));  
  12.         Console.WriteLine(childElement.GetAttribute("sex"));  
  13.         Console.WriteLine(childElement.GetAttribute("age"));  
  14.         //獲取孫節點列表
  15.         XmlNodeList grandsonNodes = childElement.ChildNodes;  
  16.         foreach (XmlNode grandsonNode in grandsonNodes)  
  17.         {  
  18.             //顯示孫節點文字
  19.             Console.WriteLine(grandsonNode.InnerText);  
  20.         }   
  21.     }  
  22. }  
(6) 查詢並修改節點
  1. //修改節點 
  2. publicvoid UpdateElement(string name)   
  3. {   
  4.     LoadXml();  
  5.     //獲取根節點的所有子節點 
  6.     XmlNodeList nodeList=xmlDoc.SelectSingleNode("user").ChildNodes;  
  7.     foreach(XmlNode childNode in nodeList)  
  8.     {  
  9.         XmlElement childElement = (XmlElement)childNode;  
  10.         //如果找到姓名為name的節點
  11.         if (childElement.GetAttribute("name") == name)   
  12.         {   
  13.             childElement.SetAttribute("name","BYH");   
  14.             //如果下面有子節點在下走 
  15.             XmlNodeList grandsonNodes = childElement.ChildNodes;  
  16.             //繼續獲取xe子節點的所有子節點 
  17.             foreach (XmlNode grandsonNode in grandsonNodes)  
  18.             {  
  19.                 XmlElement grandsonElement = (XmlElement)grandsonNode;  
  20.                 //如果找到節點名為pass的孫子節點
  21.                 if (grandsonElement.Name == "pass")  
  22.                 {  
  23.                     grandsonElement.InnerText = "66666";  
  24.                     break;   
  25.                 }   
  26.             }   
  27.             break;   
  28.         }   
  29.     }   
  30.     xmlDoc.Save("user.xml");  
  31. }   
(7) 查詢並刪除節點
  1. publicvoid deleteNode(string name)   
  2. {   
  3.     LoadXml();   
  4.     //獲取根節點的所有子節點
  5.     XmlNodeList childNodes=xmlDoc.SelectSingleNode("user").ChildNodes;  
  6.     foreach (XmlNode childNode in childNodes)  
  7.     {  
  8.         XmlElement childElement = (XmlElement)childNode;  
  9.         if (childElement.GetAttribute("name") == name)   
  10.         {  
  11.             //刪除name屬性 
  12.             childElement.RemoveAttribute("name");  
  13.             //刪除該節點的全部內容
  14.             childElement.RemoveAll();  
  15.             break;  
  16.         }   
  17.     }  
  18.     xmlDoc.Save("user.xml");  
  19. }