C# XmlDocument操作XML案例详解

作者:z海清 时间:2021-11-23 04:00:01 

C# XmlDocument操作XML

XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized 
Markup Language,标准通用标记语言)。它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule)。
任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得
含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档
类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是"模式有效的(schema valid)"。
XML文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用C#如何实现对XML文件的基本操作,
如:创建xml文件,增、删、改、查xml的节点信息。所使用的方法很基础,方便易懂(用于自己的学习和记忆只需,同时也希望能够给你带来一些帮助,
如有不合适的地方欢迎大家批评指正)。
本文的主要模块为:
① :生成xml文件
② :遍历xml文件的节点信息
③ :修改xml文件的节点信息
④ :向xml文件添加节点信息
⑤ :删除指定xml文件的节点信息
·假设我们需要设计出这样的一个xml文件来存储相应的信息,如下所示:

复制代码代码如下:


<Computers>
 <Computer ID="11111111" Description="Made in China">
   <name>Lenovo</name>
   <price>5000</price>
 </Computer>
 <Computer ID="2222222" Description="Made in USA">
   <name>IBM</name>
   <price>10000</price>
 </Computer>
</Computers>

那么如何生成这个xml文件?又怎么读取这个xml文件的节点信息,以及如何对这个xml文件的节点信息作相应的操作?请看如下代码示例:
【注:因为我们要使用xml相关的语法和方法,所以一定要引入命名空间 System.Xml】

复制代码代码如下:


using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Text;
   using System.Xml;

namespace OperateXML
  {
      class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //xml文件存储路径
                string myXMLFilePath = "E:\\MyComputers.xml";
                //生成xml文件
                GenerateXMLFile(myXMLFilePath);
                //遍历xml文件的信息
                GetXMLInformation(myXMLFilePath);
                //修改xml文件的信息
                ModifyXmlInformation(myXMLFilePath);
                //向xml文件添加节点信息
                AddXmlInformation(myXMLFilePath);
                //删除指定节点信息
                DeleteXmlInformation(myXMLFilePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

private static void GenerateXMLFile(string xmlFilePath)
        {
            try
            {
                //初始化一个xml实例
                XmlDocument myXmlDoc = new XmlDocument();
                //创建xml的根节点
                XmlElement rootElement = myXmlDoc.CreateElement("Computers");
                //将根节点加入到xml文件中(AppendChild)
                myXmlDoc.AppendChild(rootElement);

//初始化第一层的第一个子节点
                XmlElement firstLevelElement1 = myXmlDoc.CreateElement("Computer");
                //填充第一层的第一个子节点的属性值(SetAttribute)
                firstLevelElement1.SetAttribute("ID", "11111111");
                firstLevelElement1.SetAttribute("Description", "Made in China");
                //将第一层的第一个子节点加入到根节点下
                rootElement.AppendChild(firstLevelElement1);
                //初始化第二层的第一个子节点
                XmlElement secondLevelElement11 = myXmlDoc.CreateElement("name");
                //填充第二层的第一个子节点的值(InnerText)
                secondLevelElement11.InnerText = "Lenovo";
                firstLevelElement1.AppendChild(secondLevelElement11);
                XmlElement secondLevelElement12 = myXmlDoc.CreateElement("price");
                secondLevelElement12.InnerText = "5000";
                firstLevelElement1.AppendChild(secondLevelElement12);

XmlElement firstLevelElement2 = myXmlDoc.CreateElement("Computer");
                firstLevelElement2.SetAttribute("ID", "2222222");
                firstLevelElement2.SetAttribute("Description", "Made in USA");
                rootElement.AppendChild(firstLevelElement2);
                XmlElement secondLevelElement21 = myXmlDoc.CreateElement("name");
                secondLevelElement21.InnerText = "IBM";
                firstLevelElement2.AppendChild(secondLevelElement21);
                XmlElement secondLevelElement22 = myXmlDoc.CreateElement("price");
                secondLevelElement22.InnerText = "10000";
                firstLevelElement2.AppendChild(secondLevelElement22);

//将xml文件保存到指定的路径下
                myXmlDoc.Save(xmlFilePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

private static void GetXMLInformation(string xmlFilePath)
        {
            try
            {
                //初始化一个xml实例
                XmlDocument myXmlDoc = new XmlDocument();
                //加载xml文件(参数为xml文件的路径)
                myXmlDoc.Load(xmlFilePath);
                //获得第一个姓名匹配的节点(SelectSingleNode):此xml文件的根节点
                XmlNode rootNode = myXmlDoc.SelectSingleNode("Computers");
                //分别获得该节点的InnerXml和OuterXml信息
                string innerXmlInfo = rootNode.InnerXml.ToString();
                string outerXmlInfo = rootNode.OuterXml.ToString();
                //获得该节点的子节点(即:该节点的第一层子节点)
                XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
                foreach (XmlNode node in firstLevelNodeList)
                {
                    //获得该节点的属性集合
                    XmlAttributeCollection attributeCol = node.Attributes;
                    foreach (XmlAttribute attri in attributeCol)
                    {
                        //获取属性名称与属性值
                        string name = attri.Name;
                        string value = attri.Value;
                        Console.WriteLine("{0} = {1}", name, value);
                    }

//判断此节点是否还有子节点
                    if (node.HasChildNodes)
                    {
                        //获取该节点的第一个子节点
                        XmlNode secondLevelNode1 = node.FirstChild;
                        //获取该节点的名字
                        string name = secondLevelNode1.Name;
                        //获取该节点的值(即:InnerText)
                        string innerText = secondLevelNode1.InnerText;
                        Console.WriteLine("{0} = {1}", name, innerText);

//获取该节点的第二个子节点(用数组下标获取)
                        XmlNode secondLevelNode2 = node.ChildNodes[1];
                        name = secondLevelNode2.Name;
                        innerText = secondLevelNode2.InnerText;
                        Console.WriteLine("{0} = {1}", name, innerText);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

private static void ModifyXmlInformation(string xmlFilePath)
        {
            try
            {
                XmlDocument myXmlDoc = new XmlDocument();
                myXmlDoc.Load(xmlFilePath);
                XmlNode rootNode = myXmlDoc.FirstChild;
                XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
                foreach (XmlNode node in firstLevelNodeList)
                {
                    //修改此节点的属性值
                    if (node.Attributes["Description"].Value.Equals("Made in USA"))
                    {
                        node.Attributes["Description"].Value = "Made in HongKong";
                    }
                }
                //要想使对xml文件所做的修改生效,必须执行以下Save方法
                myXmlDoc.Save(xmlFilePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

}

private static void AddXmlInformation(string xmlFilePath)
        {
            try
            {
                XmlDocument myXmlDoc = new XmlDocument();
                myXmlDoc.Load(xmlFilePath);
                //添加一个带有属性的节点信息
                foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
                {
                    XmlElement newElement = myXmlDoc.CreateElement("color");
                    newElement.InnerText = "black";
                    newElement.SetAttribute("IsMixed", "Yes");
                    node.AppendChild(newElement);
                }
                //保存更改
                myXmlDoc.Save(xmlFilePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

private static void DeleteXmlInformation(string xmlFilePath)
        {
            try
            {
                XmlDocument myXmlDoc = new XmlDocument();
                myXmlDoc.Load(xmlFilePath);
                foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
                {
                    //记录该节点下的最后一个子节点(简称:最后子节点)
                    XmlNode lastNode = node.LastChild;
                    //删除最后子节点下的左右子节点
                    lastNode.RemoveAll();
                    //删除最后子节点
                    node.RemoveChild(lastNode);
                }
                //保存对xml文件所做的修改
                myXmlDoc.Save(xmlFilePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

上面的这个例子,首先是通过GenerateXMLFile方法在E盘创建出了我们预想的xml文件;然后通过GetXMLInformation方法对刚刚生成的xml文件进行了信息的读取;
之后通过ModifyXmlInformation方法对xml文件信息作出相应的修改(<Computer ID="2222222" Description="Made in USA">
修改成为<Computer ID="2222222" Description="Made in HongKong">);再之后通过AddXmlInformation方法向xml文件中添加了一个带有属性值的color节点;
最后通过DeleteXmlInformation方法将刚刚添加上的color节点删除掉。至此完成了对xml文件的基本操作:创建、读取、修改、添加、删除。

【注1:想要将对xml文件所做的任何修改生效的话,必须调用Save方法,否则我们所做的修改不会保存】
【注2:我们在创建节点的时候用的是XmlElement,但是读取节点信息的时候却用的是XmlNode,这里强调一点:XmlElement是XmlNode的继承,可以调用更多的方法
实现相应所需的功能】
最后简单集中的总结一下对xml进行操作的基本方法,如下所示:

复制代码代码如下:


//所需要添加的命名空间
using System.Xml;
//初始化一个xml实例
XmlDocument xml=new XmlDocument();
//导入指定xml文件
xml.Load(“xml文件路径path”);
//指定一个节点
XmlNode root=xml.SelectSingleNode("节点名称");
//获取节点下所有直接子节点
XmlNodeList childlist=root.ChildNodes;
//判断该节点下是否有子节点
root.HasChildNodes;
//获取同名同级节点集合
XmlNodeList nodelist=xml.SelectNodes("节点名称");
//生成一个新节点
XmlElement node=xml.CreateElement("节点名称");
//将节点加到指定节点下,作为其子节点
root.AppendChild(node);
//将节点加到指定节点下某个子节点前
root.InsertBefore(node,root.ChildeNodes[i]);
//为指定节点的新建属性并赋值
node.SetAttribute("id","11111");
//为指定节点添加子节点
root.AppendChild(node);
//获取指定节点的指定属性值
string id=node.Attributes["id"].Value;
//获取指定节点中的文本
string content=node.InnerText;
//保存XML文件
xml.Save(“xml文件存储的路径path”);

来源:https://blog.csdn.net/qq_40868987/article/details/94575707

标签:C#,XmlDocument,XML
0
投稿

猜你喜欢

  • VC对自定义资源加密解密(AES)的详解

    2023-01-10 00:27:15
  • C#使用webbrowser的常见用法实例

    2023-06-14 13:57:45
  • Flutter构建自定义Widgets的全过程记录

    2022-01-27 16:37:39
  • java实现多人聊天室可视化

    2021-08-27 01:16:49
  • C#实现微信分账功能的完整步骤

    2022-10-24 17:43:46
  • Java中缀表达式转后缀表达式实现方法详解

    2021-08-25 02:57:20
  • SpringMVC Interceptor拦截器使用教程

    2022-05-11 02:17:22
  • Java简单使用redis-zset实现排行榜

    2021-06-07 20:34:54
  • Android中使用TagFlowLayout制作动态添加删除标签

    2023-03-13 12:41:44
  • android tv列表焦点记忆实现的方法

    2023-08-25 19:36:53
  • 如何使用RequestHeaders添加自定义参数

    2023-01-10 17:37:14
  • Java编程二项分布的递归和非递归实现代码实例

    2023-08-07 09:38:04
  • Spring4整合Hibernate5详细步骤

    2022-03-15 16:53:07
  • C语言中数据是如何存储在内存中的

    2021-07-03 02:13:34
  • java中怎样表示圆周率

    2022-11-30 11:20:00
  • spring cloud Feign使用@RequestLine遇到的坑

    2023-12-15 09:18:16
  • Android 实现闪屏页和右上角的倒计时跳转实例代码

    2022-12-10 17:32:32
  • C++ 多线程之互斥量(mutex)详解

    2023-12-20 18:51:32
  • Mac中配置gradle环境及使用android studio打包jar包与arr包的方法

    2022-12-08 00:07:18
  • 基于android studio的layout的xml文件的创建方式

    2022-10-31 10:52:06
  • asp之家 软件编程 m.aspxhome.com