c# 与xml简析及序列化与反序列化

XMLDocument类

using System.Xml;//XmlDocument

简介
使用XmlDocument 实现读取和写入
XML 被设计用来传输和存储数据。

判断是否存在xml文件

private static string path = Directory.GetCurrentDirectory() + "\\ParameterSet\\grid.xml";
                if (!File.Exists(path))
                {
                    不存在
                }
                else
               {
                     存在
               }

创建

在这里插入图片描述
在这里插入图片描述

using NI_XML;
using System;

namespace Base
{
    internal class Program
    {
        public static string pathA = @"C:\SEET\";
        static void Main(string[] args)
        {
            if (!Directory.Exists(pathA))
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(pathA);
                directoryInfo.Create(); //调用一遍就会给他覆写到 也就是重新从头写一遍
            }
            RWxml NIxml = new RWxml();
            
            NIxml.CreateXml();
            //NIxml.ReadXml();
        }
    }
}
using System.Xml;
namespace NI_XML
{
    public class RWxml
    {
        string path = @"C:\SEET\test.xml";
        ///<summary>
        ///生成一个xml文档
        /// </summary>
        public void CreateXml()
        {
            //创建xml文档
            //1、实例化一个XmlDocument
            XmlDocument xDoc = new XmlDocument();

            //版本必须是1.0
            //创建一个声明xml所需要的语法的变量
            XmlDeclaration xnode = xDoc.CreateXmlDeclaration("1.0", "UTF-8", "");
            //将指定的节点添加到该节点的子节点列表的末尾 这里也就是添加到了第一行
            xDoc.AppendChild(xnode);//将xnode添加到xDoc中去


            //一个xml文档必须要有一个根元素(和普通元素创建类似 一级子节点是挂载在他下面的)且只有一个 不然创建不了
            XmlElement root = xDoc.CreateElement("school");
            //把根节点添加到xml文档中去
            xDoc.AppendChild(root);

            //在根节点下面创建第一级子节点
            XmlElement FirstNode1 = xDoc.CreateElement("教务处");
            //把第一级子节点放到根节点后面
            root.AppendChild(FirstNode1);//挂载在根节点后面 所以root.
            //再添加一个一级子节点
            XmlElement FirstNode2 = xDoc.CreateElement("体育部");
            root.AppendChild (FirstNode2);


            //添加二级子节点
            XmlElement SecNode1 = xDoc.CreateElement("一年级教务处");
            FirstNode1.AppendChild(SecNode1);
            XmlElement SecNode2 = xDoc.CreateElement("二年级教务处");
            FirstNode1.AppendChild(SecNode2);
            XmlElement SecNode3 = xDoc.CreateElement("三年级教务处");
            FirstNode1.AppendChild(SecNode3);
            XmlElement SecNode4 = xDoc.CreateElement("四年级教务处");
            FirstNode1.AppendChild(SecNode4);


            //添加属性
            root.SetAttribute("校名","北京小学"); //根节点 学校
            FirstNode1.SetAttribute("主任","王刚");//一级子节点 教务处
            FirstNode2.SetAttribute("主任", "王明");

            //增加二级字节点中的数据
            SecNode1.InnerText = "10";
            SecNode2.InnerText = "20";
            SecNode3.InnerText = "30";
            SecNode4.InnerText = "40";

            xDoc.Save(this.path);//注意这个的save路径是需要加上 .xml的

        }

        ///<summary>
        /// 读取xml
        /// </summary>
        public void ReadXml()
        {
            //实例化一个xml操作对象
            XmlDocument xDoc = new XmlDocument();

            //加载  有两个 一个是从对应的位置加载xml文档 还有一个是从指定字符串中加载xml文档
            //只有加载了以后才能操作
            xDoc.Load(this.path);

            //获取根节点 school
           XmlNode rNode = xDoc.SelectSingleNode("school");//.SelectSingleNode:取到第一个和表达式匹配的节点

            //取出来的节点 可以对其进行加 设置其属性 添加子节点
            XmlNodeList rlist = rNode.ChildNodes; //获取节点的所有子节点
          
            foreach(XmlNode r in rlist)
            {
              string name =  r.Name;//获取节点的限定名称
                Console.WriteLine("节点:"+name);

                //取属性值 要先给他做一个类型转换
              XmlElement attrb =(XmlElement)r;
                string value=attrb.GetAttribute("主任");//取出主任这个属性值
                Console.WriteLine("主任名:"+value);

                Console.WriteLine("");
            }

            //获取教务处的子节点
            XmlNodeList cnode = rlist[0].ChildNodes;
            foreach (XmlNode c in cnode)
            {
                string name =c.Name;
                string score = c.InnerText;
                c.InnerText = "100";//这样就可以修改这里面的值了
                xDoc.Save(path);//修改好了 记得保存 才会生效

                Console.WriteLine("子节点名称:" + name+";里面的值:"+score);
                         
            }
        
        }

    }
}

读取

在这里插入图片描述

using NI_XML;
using System;

namespace Base
{
    internal class Program
    {
        public static string pathA = @"C:\SEET\";
        static void Main(string[] args)
        {
            if (!Directory.Exists(pathA))
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(pathA);
                directoryInfo.Create(); //调用一遍就会给他覆写到 也就是重新从头写一遍
            }
            RWxml NIxml = new RWxml();
            
            NIxml.CreateXml();
            NIxml.ReadXml();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NI_XML;
using System.Xml;

namespace NI_XML
{
    public class RWxml
    {
        string path = @"C:\SEET\test.xml";
        ///<summary>
        ///生成一个xml文档
        /// </summary>
        public void CreateXml()
        {
            //创建xml文档
            //1、实例化一个XmlDocument
            XmlDocument xDoc = new XmlDocument();

            //版本必须是1.0
            //创建一个声明xml所需要的语法的变量
            XmlDeclaration xnode = xDoc.CreateXmlDeclaration("1.0", "UTF-8", "");
            //将指定的节点添加到该节点的子节点列表的末尾 这里也就是添加到了第一行
            xDoc.AppendChild(xnode);//将xnode添加到xDoc中去

            //一个xml文档必须要有一个根元素且只有一个 不然创建不了
            XmlElement root = xDoc.CreateElement("school");
            //把根节点添加到xml文档中去
            xDoc.AppendChild(root);

            //在根节点下面创建第一级子节点
            XmlElement FirstNode1 = xDoc.CreateElement("教务处");
            //把第一级子节点放到根节点后面
            root.AppendChild(FirstNode1);
            //再添加一个一级子节点
            XmlElement FirstNode2 = xDoc.CreateElement("体育部");
            root.AppendChild (FirstNode2);


            //添加二级子节点
            XmlElement SecNode1 = xDoc.CreateElement("一年级教务处");
            FirstNode1.AppendChild(SecNode1);
            XmlElement SecNode2 = xDoc.CreateElement("二年级教务处");
            FirstNode1.AppendChild(SecNode2);
            XmlElement SecNode3 = xDoc.CreateElement("三年级教务处");
            FirstNode1.AppendChild(SecNode3);
            XmlElement SecNode4 = xDoc.CreateElement("四年级教务处");
            FirstNode1.AppendChild(SecNode4);


            //添加属性
            root.SetAttribute("校名","北京小学"); //根节点 学校
            FirstNode1.SetAttribute("主任","王刚");//一级子节点 教务处
            FirstNode2.SetAttribute("主任", "王明");

            //增加二级字节点中的数据
            SecNode1.InnerText = "10";
            SecNode2.InnerText = "20";
            SecNode3.InnerText = "30";
            SecNode4.InnerText = "40";

            xDoc.Save(this.path);

        }

        ///<summary>
        /// 读取xml
        /// </summary>
        public void ReadXml()
        {
            //实例化一个xml操作对象
            XmlDocument xDoc = new XmlDocument();

            //加载  有两种 一种是从对应的位置加载xml文档 还有一种是从指定字符串中加载xml文档
            //只有加载了以后才能操作
            xDoc.Load(this.path);

            //获取根节点 school
           XmlNode rNode = xDoc.SelectSingleNode("school");//.SelectSingleNode:取到第一个和表达式匹配的节点

            //取出来的节点 可以对其进行加 设置其属性 添加子节点
            XmlNodeList rlist = rNode.ChildNodes; //获取根节点下的所有子节点
          
            foreach(XmlNode r in rlist)
            {
              string name =  r.Name;//获取节点的限定名称
                Console.WriteLine("节点:"+name);

                //取属性值 要先给他做一个类型转换
              XmlElement attrb =(XmlElement)r;
                string value=attrb.GetAttribute("主任");//取出主任这个属性值
                Console.WriteLine("主任名:"+value);

                Console.WriteLine("");
            }

            //获取教务处的子节点
            XmlNodeList cnode = rlist[0].ChildNodes;
            foreach (XmlNode c in cnode)
            {
                string name =c.Name;
                string score = c.InnerText;
                c.InnerText = "100";//这样就可以修改这里面的值了
                xDoc.Save(path);//修改好了 记得保存 才会生效

                Console.WriteLine("子节点名称:" + name+";里面的值:"+score);
                
                
            }
        
        }

    }
}

删除xml中指定节点


        /// <summary>
        /// 删除指定名字的节点及其子节点
        /// </summary>
        /// <param name="name"></param>
        /// <param name="root"></param>
        static void DeleteNode(string name,XmlNode root)
        {
            foreach (XmlNode node in root)
            {
                if (node.Name.Equals(name))
                {
                    node.RemoveAll();
                }
                else
                {
                    DeleteNode(name,node);
                }
            }
             xmlDoc.Save(FilePath);
        }

序列化和反序列化XML

using System.Xml;
using System.Xml.Serialization;
using System.Windows.Forms;

创建写入的值

        //创建列表
        List<stdudent> students = new List<stdudent>();
        public class stdudent
        {
            public int Age { get; set; }         //prop 然后tab 就可以快速按出来了
            public int Grade { get; set; }
            public int ID { get; set; }
            public string Name { get; set; }
        }

        public Form1()
        {
            InitializeComponent();

            //初始化列表
            students.Add(new stdudent() { Age=11,Grade=70,Name="王刚",ID=1});
            students.Add(new stdudent() { Age = 21, Grade = 50, Name = "小工", ID = 2 });
            students.Add(new stdudent() { Age = 31, Grade = 80, Name = "小红", ID = 3 });
            students.Add(new stdudent() { Age = 42, Grade =100, Name = "刘德华", ID =4 });
        }

写入

        private void uiButton1_Click(object sender, EventArgs e)
        {
            XmlSerializer xml=new XmlSerializer(typeof(List<stdudent>));//XmlSerializer 类,它可以序列化的 XML 文档,将指定类型的对象反序列化 XML文档化为指定类型的对象。 using System.Xml.Serialization;
            string path = Application.StartupPath;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。  using System.Windows.Forms;
            System.IO.Stream stream = new System.IO.FileStream(path+@"students.xml", System.IO.FileMode.OpenOrCreate);
            //Stream stream:System.IO.Stream 用于写入 XML 文档。
            //object o:要序列化的 System.Object。
            xml.Serialize(stream,students);//将序列化为指定 System.Object ,并使用指定的文件中写入 XML 文档 System.IO.Stream。
           
            //只有关闭了 才能执行下面的读取操作
            stream.Close();//关闭流 
            stream.Dispose();//释放流占用的资源
        }

在这里插入图片描述
在这里插入图片描述

读出

        private void uiButton2_Click(object sender, EventArgs e)
        {
            XmlSerializer xml = new XmlSerializer(typeof(List<stdudent>));
            string path = Application.StartupPath;
            System.IO.Stream stream = new System.IO.FileStream(path + @"students.xml", System.IO.FileMode.OpenOrCreate);

            var t =(List<stdudent>)xml.Deserialize(stream);
            stream.Close();//关闭流 
            stream.Dispose();//释放流占用的资源

        }

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值