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) 增加宣告段落:
- XmlDocument xmldoc = new XmlDocument();
- //加入XML的宣告段落,<?xmlversion="1.0" encoding="gb2312"?>
- XmlDeclaration xmldecl;
- xmldecl = xmldoc.CreateXmlDeclaration("1.0","gb2312", null);
- xmldoc.AppendChild(xmldecl);
(2) 加入根元素
- privatevoid CreateRootElement()
- {
- xmlDoc = new XmlDocument();
- XmlElement xmlelem = xmlDoc.CreateElement("user");
- xmlDoc.AppendChild(xmlelem);
- //儲存建立好的XML文件
- xmlDoc.Save("User.xml");
- }
(3) 裝載XML檔案
- //load xml file
- privatevoid LoadXml()
- {
- if (isFileExisted == false)
- {
- xmlDoc = new XmlDocument();
- CreateRootElement();
- isFileExisted = true;
- return;
- }
- xmlDoc=new XmlDocument();
- xmlDoc.Load("User.xml");
- }
- //新增節點
- publicvoid AddElement(string name, string sex, string age, string pass, string address)
- {
- //裝載Xml檔案
- LoadXml();
- //獲取根節點
- XmlNode xmldocSelect = xmlDoc.SelectSingleNode("user");
- //建立元素Person
- XmlElement personElement = xmlDoc.CreateElement("person");
- //person節點的三個屬性
- personElement.SetAttribute("name", name);
- personElement.SetAttribute("sex", sex);
- personElement.SetAttribute("age", age);
- //建立一個新的元素
- XmlElement passElement=xmlDoc.CreateElement("pass");
- //設定節點的串聯值
- passElement.InnerText = pass;
- //將新建立的節點pass新增為person節點的子節點
- personElement.AppendChild(passElement);
- XmlElement addrElement=xmlDoc.CreateElement("Address");
- addrElement.InnerText = address;
- personElement.AppendChild(addrElement);
- //新增person節點
- xmldocSelect.AppendChild(personElement);
- xmlDoc.Save("user.xml");
- }
(用了兩種遍歷方式:XmlNode,XmlElement)
- //輸出xml文件
- publicvoid showXml()
- {
- LoadXml();
- //獲取根節點
- XmlElement rootElement = xmlDoc.DocumentElement;
- //挨個查詢其下的子節點
- foreach (XmlElement childElement in rootElement)
- {
- //分別輸出子節點屬性
- Console.WriteLine(childElement.GetAttribute("name"));
- Console.WriteLine(childElement.GetAttribute("sex"));
- Console.WriteLine(childElement.GetAttribute("age"));
- //獲取孫節點列表
- XmlNodeList grandsonNodes = childElement.ChildNodes;
- foreach (XmlNode grandsonNode in grandsonNodes)
- {
- //顯示孫節點文字
- Console.WriteLine(grandsonNode.InnerText);
- }
- }
- }
- //修改節點
- publicvoid UpdateElement(string name)
- {
- LoadXml();
- //獲取根節點的所有子節點
- XmlNodeList nodeList=xmlDoc.SelectSingleNode("user").ChildNodes;
- foreach(XmlNode childNode in nodeList)
- {
- XmlElement childElement = (XmlElement)childNode;
- //如果找到姓名為name的節點
- if (childElement.GetAttribute("name") == name)
- {
- childElement.SetAttribute("name","BYH");
- //如果下面有子節點在下走
- XmlNodeList grandsonNodes = childElement.ChildNodes;
- //繼續獲取xe子節點的所有子節點
- foreach (XmlNode grandsonNode in grandsonNodes)
- {
- XmlElement grandsonElement = (XmlElement)grandsonNode;
- //如果找到節點名為pass的孫子節點
- if (grandsonElement.Name == "pass")
- {
- grandsonElement.InnerText = "66666";
- break;
- }
- }
- break;
- }
- }
- xmlDoc.Save("user.xml");
- }
- publicvoid deleteNode(string name)
- {
- LoadXml();
- //獲取根節點的所有子節點
- XmlNodeList childNodes=xmlDoc.SelectSingleNode("user").ChildNodes;
- foreach (XmlNode childNode in childNodes)
- {
- XmlElement childElement = (XmlElement)childNode;
- if (childElement.GetAttribute("name") == name)
- {
- //刪除name屬性
- childElement.RemoveAttribute("name");
- //刪除該節點的全部內容
- childElement.RemoveAll();
- break;
- }
- }
- xmlDoc.Save("user.xml");
- }