XML文件的一些操作,增删改查

C#操作xml主要有这么几个对象:XmlDocument、XmlElement、XmlNode

命名空间:

using System.Xml;

知识补充:

XmlNode和XmlElement的区别:

1、Element是一个小范围的定义,必须含有完整信息的节点才能叫做元素。

2、Node是基本对象,Attribute、Element、Text等都是Node的子对象。

一个元素一定是一个节点,而一个节点不一定是元素。

XmlElement与XmlNode之间的继承关系如下:

System..::.Object

  System.Xml..::.XmlNode

    System.Xml..::.XmlLinkedNode

      System.Xml..::.XmlElement

体现在属性和方法中:

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) 增加声明段落:

[csharp] view plain copy

  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) 加入根元素

[csharp] view plain copy

  1. private void CreateRootElement()    
  2. {    
  3.     xmlDoc = new XmlDocument();    
  4.     XmlElement xmlelem = xmlDoc.CreateElement("user");    
  5.     xmlDoc.AppendChild(xmlelem);    
  6.     
  7.     //保存创建好的XML文档    
  8.     xmlDoc.Save("User.xml");    
  9. }   

(3) 装载XML文件

[csharp] view plain copy

  1. //load xml file     
  2. private void 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) 增加新元素

[csharp] view plain copy

  1. //添加节点     
  2. public void AddElement(string name, string sex, string age, string pass, string address)     
  3. {    
  4.     //装载Xml文件    
  5.     LoadXml();    
  6.     //获取根节点    
  7.     XmlNode xmldocSelect = xmlDoc.SelectSingleNode("user");    
  8.     
  9.     //创建元素Person    
  10.     XmlElement personElement = xmlDoc.CreateElement("person");    
  11.     
  12.     //person节点的三个属性    
  13.     personElement.SetAttribute("name", name);    
  14.     personElement.SetAttribute("sex", sex);    
  15.     personElement.SetAttribute("age", age);    
  16.     
  17.     //创建一个新的元素    
  18.     XmlElement passElement=xmlDoc.CreateElement("pass");     
  19.     //设置节点的串联值    
  20.     passElement.InnerText = pass;    
  21.     //将新创建的节点pass添加为person节点的子节点    
  22.     personElement.AppendChild(passElement);    
  23.     
  24.     XmlElement addrElement=xmlDoc.CreateElement("Address");    
  25.     addrElement.InnerText = address;    
  26.     personElement.AppendChild(addrElement);    
  27.     
  28.     //添加person节点    
  29.     xmldocSelect.AppendChild(personElement);    
  30.     xmlDoc.Save("user.xml");     
  31. }   

(5) 输出xml文档内容:

(用了两种遍历方式:XmlNode,XmlElement)

[csharp] view plain copy

  1. //输出xml文档    
  2. public void showXml()    
  3. {    
  4.     LoadXml();    
  5.     //获取根节点    
  6.     XmlElement rootElement = xmlDoc.DocumentElement;    
  7.         
  8.     //挨个查找其下的子节点    
  9.     foreach (XmlElement childElement in rootElement)    
  10.     {    
  11.         //分别输出子节点属性    
  12.         Console.WriteLine(childElement.GetAttribute("name"));    
  13.         Console.WriteLine(childElement.GetAttribute("sex"));    
  14.         Console.WriteLine(childElement.GetAttribute("age"));    
  15.     
  16.         //获取孙节点列表    
  17.         XmlNodeList grandsonNodes = childElement.ChildNodes;    
  18.         foreach (XmlNode grandsonNode in grandsonNodes)    
  19.         {    
  20.             //显示孙节点文本    
  21.             Console.WriteLine(grandsonNode.InnerText);    
  22.         }     
  23.     }    
  24. }    

(6) 查找并修改节点

[csharp] view plain copy

  1.  //修改节点     
  2. public void UpdateElement(string name)     
  3. {     
  4.     LoadXml();    
  5.     //获取根节点的所有子节点     
  6.     XmlNodeList nodeList=xmlDoc.SelectSingleNode("user").ChildNodes;    
  7.         
  8.     foreach(XmlNode childNode in nodeList)    
  9.     {    
  10.         XmlElement childElement = (XmlElement)childNode;    
  11.     
  12.         //如果找到姓名为name的节点    
  13.         if (childElement.GetAttribute("name") == name)     
  14.         {     
  15.             childElement.SetAttribute("name","BYH");     
  16.                 
  17.             //如果下面有子节点在下走     
  18.             XmlNodeList grandsonNodes = childElement.ChildNodes;    
  19.             //继续获取xe子节点的所有子节点     
  20.             foreach (XmlNode grandsonNode in grandsonNodes)    
  21.             {    
  22.                 XmlElement grandsonElement = (XmlElement)grandsonNode;    
  23.                 //如果找到节点名为pass的孙子节点    
  24.                 if (grandsonElement.Name == "pass")    
  25.                 {    
  26.                     grandsonElement.InnerText = "66666";    
  27.                     break;     
  28.                 }     
  29.             }     
  30.             break;     
  31.         }     
  32.     }     
  33.     xmlDoc.Save("user.xml");    
  34. }     

(7) 查找并删除节点

[csharp] view plain copy

  1. public void deleteNode(string name)     
  2. {     
  3.     LoadXml();     
  4.     //获取根节点的所有子节点    
  5.     XmlNodeList childNodes=xmlDoc.SelectSingleNode("user").ChildNodes;    
  6.     
  7.     foreach (XmlNode childNode in childNodes)    
  8.     {    
  9.         XmlElement childElement = (XmlElement)childNode;    
  10.         if (childElement.GetAttribute("name") == name)     
  11.         {    
  12.             //删除name属性     
  13.             childElement.RemoveAttribute("name");    
  14.             //删除该节点的全部内容    
  15.             childElement.RemoveAll();    
  16.                 
  17.             break;    
  18.         }     
  19.     }    
  20.     
  21.     xmlDoc.Save("user.xml");    
  22. }    

猜你喜欢

转载自blog.csdn.net/qq_36074218/article/details/85006038