二十、C#文件操作值xml

C#操作xml文件:DOM与Linq方式对比

1、XML基础知识

  • 文件声明:<?xml version="1.0"?> ,最简单的声明方式
  • 文档中必须有一个根标签
  • 属性用双引号或单引号引起来
  • CDATA区、特殊字符 <![CATAT[不想解析的内容]]>
  • 特殊符号
 - & : &amp;
 - <  : &lt;
 - >   : &gt;
 - "   : &quot
 - ,   : apos;
<?xml version="1.0" encoding="utf-8"?>  
<students>    <!--定义一个根节点-->
	<student name="xiaoming" />		
	<student>
		<name>xiaoming</name>
		<read>&lt;三国演义&gt;</read>
	</student>
	<student>
		<name>xiaoqing</name>
		<read>&quot;三国演义&quot;</read>
	</student>
	<!--以下区域块中内容不被解析器解析-->
	<![CDATA[
	<student>
		<name>xiaobai</name>
		<read>三国演义</read>
	</student>
	]]>  
</students>

保存设置编码方式
在这里插入图片描述
在这里插入图片描述

2、生成xml文档

主函数

namespace xml_文件操作
{
    class Program
    {
        static void Main(string[] args)
        {
            RWXml app = new RWXml();
            app.WriteXML();

        }
    }
}

XML操作类

using System;
//引用命名空间
using System.Xml;

namespace xml_文件操作
{
    public class RWXml
    {
        /// <summary>
        /// 生成一个XML文档
        /// </summary>
        public void WriteXML()
        {
            //随机数
            Random rd = new Random();
            //首先,创建xml文档
            /*1、实例化一个xmlDocument类*/
            XmlDocument xdoc = new XmlDocument();
            //创建一个声明xml文档所需要语法的变量
            XmlDeclaration declaration = xdoc.CreateXmlDeclaration("1.0", "UTF-8", "yes"); //第一个参数是1.0指版本,第二个参数是编码方式,
                                                                                           // 上面语句第三个参数:standalone类型:System.String 包含"yes"或"no"的字符串,用来指定 XML 是独立的还是需要解析外部实体。
            xdoc.AppendChild(declaration);   //将指定的节点添加到该节点的子节点列表的末尾。
            //一个xml文档,必须有一个根元素
            //创建根节点students
            XmlElement elem = xdoc.CreateElement("students");
            //把根节点添加到xml文档中
            xdoc.AppendChild(elem);

            for(int i=1; i<=10; i++)
            { 
            //添加子节点
            XmlElement elem1 =  xdoc.CreateElement("student");
            //将第二级节点,放置到根节点的下面
            elem.AppendChild(elem1);

            //给节点添加属性,xml中属性值必须用双引号引起
            elem1.SetAttribute("name", "张三");
            elem1.SetAttribute("No",i.ToString());

            //添加第三级节点
            XmlElement elemet1_1 = xdoc.CreateElement("语文成绩");
            //将第三级的节点,放置到第二级节点下面
            elem1.AppendChild(elemet1_1);
            elemet1_1.InnerText = rd.Next(60,100).ToString();  //获取或设置节点及其所有子级的串联值

            //添加第三级节点
            XmlElement elemet1_2 = xdoc.CreateElement("数学成绩");
            //将第三级的节点,放置到第二级节点下面
            elem1.AppendChild(elemet1_2);
            elemet1_2.InnerText = rd.Next(60,100).ToString();

            //添加第三级节点
            XmlElement elemet1_3 = xdoc.CreateElement("外语成绩");
            //将第三级的节点,放置到第二级节点下面
            elem1.AppendChild(elemet1_3);
            elemet1_3.InnerText = rd.Next(60,100).ToString();
            }

            xdoc.Save("students.xml");

        }
       
    }
}

3、读取xml文档及修改

using System;
//引用命名空间
using System.Xml;

namespace xml_文件操作
{
    public class RWXml
    {

        /// <summary>
        /// 读取xml文档
        /// </summary>
        public void ReadXML()
        {
            /*1、实例化一个xmlDocument类*/
            XmlDocument xdoc = new XmlDocument();
            //加载xml内容
            xdoc.Load("students.xml");

            //获取根节点Studets
            XmlNode rootnode = xdoc.SelectSingleNode("students");  //获取第一个符合表达式(参数值)的XML节点,因为xml文件只有一个根节点,所以此处获取的是根节点
            XmlNodeList nodeList = rootnode.ChildNodes;
            foreach(XmlNode xn in nodeList)
            {
                string Nodename = xn.Name;    //获取节点的名称                
                //Console.WriteLine(Nodename);
                //类型显示转换
                XmlElement xmle = (XmlElement)xn;
                //获取属性
                string nameAttri = xmle.GetAttribute("name");
                string noAttri = xmle.GetAttribute("No");
                if (noAttri == "5")
                {
                    xmle.SetAttribute("name", "李四");
                }

                //先输出姓名和学号
                Console.WriteLine("名称节点为" + Nodename +"的属性:"+ nameAttri+"/"+noAttri);
                //获取三级节点
                XmlNodeList childList = xn.ChildNodes;
                foreach(XmlNode xn3 in xn)
                {
                    //类型转换
                    XmlElement xe = (XmlElement)xn3;
                    string className = xe.Name;
                    string score = xe.InnerText;
                    //输出成绩信息
                    Console.Write(className+score+"\t");
                    if(noAttri=="10")
                    {
                        xe.InnerText = "100";
                    }
                }
                Console.WriteLine();
            }
            //生成或修改XML文档的时候,末尾一定要写save方法
            xdoc.Save("students.xml");
            Console.ReadKey();
        }   
    }
}

4、其他参考信息

C#对XML文件的各种操作实现方法

4.1 生成XML

  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());
             }
         }

4.2 读取xml(属性获取可以参看,与3中中属性获取不同)

  • 内含判断是否还有子节点
  • 属性获取可以参看,与3中中属性获取不同
  • 可使用索引值的方式获取响应的子节点
 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());
             }
         }

4.3 修改子节点

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());
             }

         }

4.4 删除子节点

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());
             }
         }
     }
 }

4.5 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”);

C# 使用linq操作xml

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值