C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)

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的声明段落,  
  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. }  

XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀。XML文档主要由元素节点和节点的属性共同构成的。它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子子节点;每一个节点有开始就一定会有结束,不可能出现有开始无结束的节点,节点主要有两种类型:有InnerText……和没有InnerText。在节点中含有属性,一个节点可以含有多个属性,每个属性是由名字和值共同构成的。

XML文档中,节点、属性都是区分大小写的。对于某个节点的属性,Name是不能重复的,即使在定义属性的时候,定义了两个name完全相同的属性,添加到同一个节点上面,后面的属性会把前面的属性覆盖,不会报语法错误;对于某个节点下面的子节点,则可以添加多个完全相同的子节点。

       XML文档的操作的前提是:XML文档已经存在,并且根节点已经存在。

1、添加节点和属性

1、定义一个XML的操作对象:

XmlDocument doc = new XmlDocument();

2、加载一个XML文件:

doc.Load(@"D:\App.config");

指定的文件一定要存在,否则会报错的。

3、获取根节点:

XmlNode root = doc.DocumentElement;

4、定义一个属性:

XmlAttribute ra = doc.CreateAttribute("Name");

5、给属性的值赋值:

ra.Value = "zwj2";

6、将属性添加到节点上面:

root.Attributes.Append(ra);

7、再定义一个节点为根节点的子节点:

XmlNode root1 = doc.CreateElement("table");

8、给节点赋文本值:

root1.InnerText = "sdf1";

9、给节点定义并添加属性

10、将该节点添加到父节点上去:

root.AppendChild(root1);

11、保存XML文档:

doc.Save(@"D:\App.config");

注意:可以对一个节点添加多个属性,那么各个属性会依次往后排;可以给根节点添加多个子节点,也可以对子节点再添加多个子节点。

2、查询和修改节点和属性

1、元素结点有Name属性,就是<>里面的串,也有InnerText属性(相当于文本结点),就是<>之间的串:root.Name、root.InnerText。这些属性都是可以读写的。------------------------------XmlNode

2、属性结点有Name,也有Value:providerName="System.Data.SqlClient",前面为Name,后面为Value这些属性既可读也可写。-----------------------------------------------------------XmlAttribute

3、每一个结点有子结点的集合,也有属性的集合:root.ChildNodes、root.Attributes;集合都有count属性。

4、集合都满足索引:

对于属性集合,属性的name是不能重复的,所以索引可以是name字符串索引,那么name字符串要存在,否则返回的是一个null属性对象,不会报错;也可以是整数索引,那么此时的整数不能越界,否则是会报错的;:root.Attributes["name"]、root.Attributes[0],返回XmlAttribute

对于子节点的集合,因为子节点可以完全相同,那么子节点的name肯定也可以相同,所以此时的索引只能是整数的,而不能是子节点name字符串,整数索引也不能越界,否则会报错: root.ChildNodes[10],返回XmlNode

3、几个重要的函数

1、XmlNode XmlDocument.SelectSingleNode(@"configuration/twoNode/dayStart")

这个函数是用一个声明好的并且已经成功加载了某个配置文件的XmlDocument对象去调用SelectSingleNode函数;该函数的参数是配置文件中的从根节点名字开始一直往下最终到想要的节点的名字,整个名字路径都不能出错,注意是左斜杠;函数的返回值是第一次找到的XmlNode节点的对象,如果找不到就会返回null。

操作如下xml

xmlversion="1.0"?>

<configuration>

  <twoNode>

  twoNode>

  <twoNode>

    <dayStart>1dayStart>

    <dayStart>2dayStart>

    <dayStart>3dayStart>

  twoNode

configuration>

如果执行该函数,那么将会找到节点:<dayStart>1dayStart>

2、XmlNodeList XmlDocument.SelectNodes (@"configuration/twoNode/dayStart")

这个函数是用一个声明好的并且已经成功加载了某个配置文件的XmlDocument对象去调用SelectNodes函数;该函数的参数是配置文件中的从根节点名字开始一直往下最终到想要的节点的名字,整个名字路径都不能出错,注意是左斜杠;因为节点的名字是可能重复的,所以函数的返回值是找到的所有XmlNode节点对象的集合XmlNodeList,如果找不到就会返回null。

XmlNodeList是集合,那么就有count属性,可以直接对这个集合用[int index]来索引具体的对象,也可以用集合的Item(int index)函数来索引具体的对象,但是索引不能越界,否则会出错,返回的是XmlNode

操作如下xml

xmlversion="1.0"?>

<configuration>

  <twoNode>

    <dayStart>-1dayStart>

    <dayStart>-2dayStart>

    <dayStart>-3dayStart>

  twoNode>

  <twoNode>

    <dayStart>1dayStart>

    <dayStart>2dayStart>

    <dayStart>3dayStart>

  twoNode

configuration>

如果执行该函数,那么将会找到节点集合:

    <dayStart>-1dayStart>

    <dayStart>-2dayStart>

<dayStart>-3dayStart>

    <dayStart>1dayStart>

    <dayStart>2dayStart>

<dayStart>3dayStart>

 

操作如下xml

xmlversion="1.0"?>

<configuration>

  <twoNode>

  twoNode>

  <twoNode>

    <dayStart>1dayStart>

    <dayStart>2dayStart>

    <dayStart>3dayStart>

  twoNode

configuration>

如果执行该函数,那么将会找到节点集合:

    <dayStart>1dayStart>

    <dayStart>2dayStart>

    <dayStart>3dayStart>

你可能感兴趣的:(C#)