• 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”
  • 相关阅读:
    判断一个值是不是数字
    webpack起的项目怎么用手机访问?
    vue 父子组件数据双向绑定
    js取整
    封装加减乘除函数 解决JS 浮点数计算 Bug
    javascript笔记 (持续更新)
    ajax请求的原生js实现
    程序员の健康和效率装备列表,普通人也能参考
    Java static,final 基本概念
    Download EditPlus Text Editor
  • 原文地址:https://www.cnblogs.com/zhuqun/p/11344679.html
Copyright © 2020-2023  润新知