.NET-21-Xml文件操作

Xml文件的读写操作

XmlDecoment兼容2.0

XDocument是3.0之后新增的方式,而且操作起来要方便一些

public class 读写XML
    {

        /* 读写XML的方式
         * 1.Dom[XmlDocument,XDocument]
         * 文档对象模型,将xml文件整个读取到内存汇总,然后操作
         * 可以把整个xml文档读取之后当做一个对象来操作
         * 优点是操作方便
         * 缺点是如果文件比较大的话,对内存是个比较大的开销
         * XmlDocument对应的和xpath表达式一起使用
         * XmlDocument可以兼容2.0
         * 在System.Xml命名空间下
         * XDocument对应的和Lambda表达式和扩展方法一起使用
         * XDocument是3.0开始使用的
         * 在System.Xml.Linq命名空间下
         *
         * 2.Sax
         * 事件驱动,这个是JAVA中的,在.NET中使用XmlReader,XmlWriter
         * 优点是可以操作大的文件
         * 但是缺点是使用不方便,需要对每个节点进行判断操作
         *
         * 3.XmlSerializer
         * Xml序列化器
         * 把一个对象写入到xml文件的时候使用XmlSerializer会非常方便
         *
         * 4.Linq To Xml
         * System.Xml.Linq,其实就是Dom
         *
         */

        /// <summary>
        /// 读取XML
        /// </summary>
        public static void ReadXml()
        {
            #region     使用XDocument读取xml文件
            Console.WriteLine("XDocument递归获取所有节点:");
            //读取文件
            XDocument xDom = XDocument.Load(@"C:\Users\Administrator\Desktop\test\练习用文件\xdom.xml");

            //获取根节点
            XElement xRoot = xDom.Root;
            //输出
            Console.WriteLine(xRoot.Name);
            ////这里输出的是根节点下面的所有的内容拼接的字符串
            //Console.WriteLine(xRoot.Value);
            //或者加载到一个TreeView下
            //TreeNode rootNode = treeView1.Nodes.Add(xRoot.Name.ToString());

            //递归加载所有的子节点
            LoadXDocument(xRoot);
            //或者递归加载到TreeView中
            //LoadXDocument(xRoot, rootNode.Nodes);


            //获取指定节点
            Console.WriteLine("XDocument获取指定节点:");
            //使用Lambda表达式获取指定的路径
            //使用根节点来获取指定节点
            IEnumerable<XElement> xeList = xRoot.Descendants("student").Where(x => x.Value == "盈盈");
            foreach (XElement item in xeList)
            {
                //输出属性
                Console.WriteLine(item.Attribute("id").Value);
                Console.WriteLine(item.Name);
            }


            #endregion    使用XDocument读取xml文件

            Console.WriteLine();
            Console.WriteLine();
            #region     使用XmlDocument读取xml文件
            Console.WriteLine("XmlDocument递归获取所有节点:");
            //创建一个XmlDocument对象
            XmlDocument xmlDom = new XmlDocument();
            //加载xml文件
            xmlDom.Load(@"C:\Users\Administrator\Desktop\test\练习用文件\xmldom.xml");

            //获取根节点
            XmlElement xmlRoot = xmlDom.DocumentElement;
            Console.WriteLine(xmlRoot.Name);

            //递归加载所有的子节点
            LoadXmlDocument(xmlRoot);

            //获取指定节点
            Console.WriteLine("XDocument获取指定节点:");
            //根据节点名称获取
            XmlNodeList xmlList = xmlDom.GetElementsByTagName("name");
            foreach (XmlNode item in xmlList)
            {
                Console.WriteLine("{0}--{1}", item.Name.ToString(), "");
            }

            //根据ID属性获取
            //xml中的ID是唯一的,是不能重复的
            //所以使用GetElementById获取的只能是一个节点信息
            //但是在使用ID获取的时候,需要有对应的文档声明,不然系统无法识别哪个属性是ID(ps:因为xml的任何属性名称都可以声明为ID)
            //XmlElement xmlList2 = xmlDom.GetElementById("c01");
            //Console.WriteLine(xmlList2.Name);
            //Console.WriteLine(xmlList2.OuterXml);

            //根据xpath表达式(路径表达式)获取指定的节点

            #endregion   使用XmlDocument读取xml文件
        }


        /// <summary>
        /// 直接输出
        /// </summary>
        /// <param name="xRoot"></param>
        private static void LoadXDocument(XElement xRoot)
        {
            //获取该节点下的所有子元素
            foreach (XElement item in xRoot.Elements())
            {
                ////输出节点的名称
                //Console.WriteLine(item.Name.ToString());
                ////输出节点内容
                //Console.WriteLine(item.Value.ToString());
                //如果当前节点是叶子节点
                if (item.Elements().Count() == 0)
                {
                    Console.WriteLine("{0}-{1}", item.Name, item.Value);
                }
                else
                {
                    Console.WriteLine(item.Name.ToString());
                    LoadXDocument(item);
                }
            }
            ////获取该元素下的指定的子元素
            //xRoot.Elements("name");

        }


        ///// <summary>
        ///// 加载到TreeVieww
        ///// </summary>
        ///// <param name="xRoot"></param>
        ///// <param name="treeNodes"></param>
        //private static void LoadXDocument(XElement xRoot, TreeNodeCollection treeNodes)
        //{
        //    //获取该节点下的所有子元素
        //    foreach (XElement item in xRoot.Elements())
        //    {
        //        if (item.Elements().Count() == 0)
        //        {
        //            treeNodes.Nodes.Add("{0}-{1}", item.Name.ToString(), item.Value.ToString());
        //        }
        //        else
        //        {
        //           TreeNode treeNode treeNodes.Nodes.Add(item.Name.ToString());
        //            LoadXmlDocument(item,treeNode.Nodes);
        //        }
        //    }
        //}


        /// <summary>
        /// 递归加载
        /// </summary>
        /// <param name="xmlRoot"></param>
        private static void LoadXmlDocument(XmlElement xmlRoot)
        {
            //循环遍历
            foreach (XmlNode item in xmlRoot.ChildNodes)
            {
                //在使用之前需要判断一下当前节点是什么类型的节点
                if (item.NodeType == XmlNodeType.Element)
                {
                    //如果当前节点是元素节点则输出
                    Console.WriteLine(item.Name);
                    //递归调用
                    LoadXmlDocument((XmlElement)item);
                }
                else if (item.NodeType == XmlNodeType.Text || item.NodeType == XmlNodeType.CDATA)
                {
                    Console.WriteLine(item.InnerText);
                }
            }
        }

        /// <summary>
        /// 写入XML
        /// </summary>
        public static void WriteXml()
        {
            //创建一个数据源
            List<Student> list = new List<Student>();
            list.Add(new Student() { Name = "盈盈", Age = 18, Gender = '女', Address = "北京" });
            list.Add(new Student() { Name = "硕硕", Age = 2, Gender = '男', Address = "合肥" });
            list.Add(new Student() { Name = "黄磊", Age = 99, Gender = '男', Address = "北京天安门城门楼" });

            #region    XmlDocument变成方式写入xml文件,这个是兼容2.0版本
            //创建一个Dom对象
            XmlDocument xmlDom = new XmlDocument();
            //添加声明
            XmlDeclaration xmlDeclaration = xmlDom.CreateXmlDeclaration("1.0", "utf-8", "yes");
            //添加节点到Dom中
            xmlDom.AppendChild(xmlDeclaration);

            //开始把数据源添加到Dom中,添加一个跟节点school
            XmlElement xmlRoot = xmlDom.CreateElement("school");
            xmlDom.AppendChild(xmlRoot);

            //添加一个节点class,这里如果有多个可以在增加一个循环
            XmlElement xmlClass = xmlDom.CreateElement("class");
            //添加一个名字为id的属性
            XmlAttribute xmlAttribute = xmlDom.CreateAttribute("id");
            xmlAttribute.Value = "c01";
            xmlClass.Attributes.Append(xmlAttribute);
            xmlRoot.AppendChild(xmlClass);

            //循环添加student
            foreach (Student item in list)
            {
                //创建一个student对象
                XmlElement xmlStudent = xmlDom.CreateElement("student");
                xmlClass.AppendChild(xmlStudent);

                //添加student的属性
                //name
                XmlElement xmlName = xmlDom.CreateElement("name");
                xmlName.InnerText = item.Name;
                xmlStudent.AppendChild(xmlName);

                //age
                XmlElement xmlAge = xmlDom.CreateElement("age");
                xmlAge.InnerText = item.Age.ToString();
                xmlStudent.AppendChild(xmlAge);

                //gender
                XmlElement xmlGender = xmlDom.CreateElement("gender");
                xmlGender.InnerText = item.Gender.ToString();
                xmlStudent.AppendChild(xmlGender);

                //address
                XmlElement xmlAddress = xmlDom.CreateElement("address");
                xmlAddress.InnerText = item.Address;
                xmlStudent.AppendChild(xmlAddress);
            }

            //2.把构建的Dom写入xml文件
            xmlDom.Save(@"C:\Users\Administrator\Desktop\test\练习用文件\xmldom.xml");
            #endregion    XmlDocument变成方式写入xml文件

            #region    XDocument写入xml文件,这是3.0版本开始有的方法
            XDocument xDom = new XDocument();
            //创建声明(这里也可以不写)
            XDeclaration xDec = new XDeclaration("1.0", "utf-8", "yes");
            xDom.Declaration = xDec;

            //创建根节点
            XElement xRoot = new XElement("school");
            xDom.Add(xRoot);

            //添加一个节点class
            XElement xClassElement = new XElement("class");
            xClassElement.SetAttributeValue("id", "c01");
            xRoot.Add(xClassElement);

            //循环添加student对象
            foreach (Student item in list)
            {
                //添加student对象
                XElement xStudent = new XElement("student");
                xClassElement.Add(xStudent);

                //添加student的属性
                xStudent.SetElementValue("name", item.Name);
                xStudent.SetElementValue("age", item.Age);
                xStudent.SetElementValue("gender", item.Gender);
                xStudent.SetElementValue("address", item.Address);
            }

            //保存Dom对象到文件
            xDom.Save(@"C:\Users\Administrator\Desktop\test\练习用文件\xdom.xml");
            #endregion   XDocument写入xml文件,这是3.0版本开始有的方法

        }
    }


    /// <summary>
    /// 创建一个数据源的类
    /// </summary>
    public class Student
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }


        private char _gender;

        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }


        private string _address;

        public string Address
        {
            get { return _address; }
            set { _address = value; }
        }
    }

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/81462279