C#对Xml的文件操作

目的:为了能在Api传值的Xml文件进行操作

结果:自行重复网络博客的 操作

代码:(对场景进行模拟和提前了方法,用了两种类型的方法操作1.直接借助C#包进行操作2.利用简介的Linq操作,当然还有一种方法XmlTextReader和XmlTextWriter(没有进行测试)

 class Program
    {
        static void Main(string[] args)
        {
            //公共变量
            //赋值的类
            BookModel bookModel = new BookModel();
            bookModel.BookType = "必修课";
            bookModel.BookISBN = "4522-525-1-1";
            bookModel.BookAuthor = "wei";
            bookModel.BookName = "大学1";
            bookModel.BookPrice = 21.55;
            //指定节点属性的位置
            string findIdName = "/bookstore/book[@ISBN=\"7-111-19149-2555\"]";
            string ISBN = "7-111-19149-2555";
            //xml文件路径
            string url = @"..\..\Book.xml";
            //定义文件
            XElement doc = XElement.Load(url);//文件路径

            
/*********************************以下为方法,建议单独注释测试*****************************************/
/*
             //输出指定的值,读取xml文件转化为类
            var bookModelList = GetXml(url);
             Console.WriteLine(bookModelList[0].BookAuthor.ToString());
             Console.ReadKey();


            //添加Xml,list类分成一个一个类添加
             foreach (BookModel xml in bookModelList)
            {
                //追加数据
                AddXml(url, xml);
            }

            //覆盖数据,只留下新增的数据 和主节点
             Modify(url, bookModel);


            //指定某节点中属性的唯一码,去删除整个节点
             DeleteXml(url, findIdName);

            //修改节点
            //修改某 条数据的话,首先也是用Xpath表达式找到所需要修改的那一个结点,然后如果是元素的话,就直接对这个元素赋值,如果是属性的话,就用SetAttribute方法设置即可.如下:
            XiuGai(bookModel, findIdName, url);
            */

/*****************************************以下为Linq方法**********************************/
/*
            //查询一

            IEnumerable<XElement> partNos = from c in doc.Descendants("book") select c; //有点像查询语句,没有数据的
            var get = showInfoByElements(partNos);
           
            //查询二
            //   3.1读取所有的数据
            //直接找到元素为book的这个结点,然后遍历读取所有的结果.
           IEnumerable<XElement> elements = from ele in doc.Elements("book") select ele;
           var gettwo = showInfoByElements(elements);
          

            //插入数据
             XElement record = new XElement(new XElement("book",new XAttribute("Type", "选修课"),new XAttribute("ISBN","7-111-19149-1"), new XElement("title", "计算机操作系统1"),
             new XElement("author", "7-111-19149-1"),
             new XElement("price", 28.00)));
              doc.Add(record); //xml格式
              //doc.Add(bookModel);
              doc.Save(url);

            //删除
            //dgvBookInfo.CurrentRow.Cells[1]对应着ISBN号
            IEnumerable<XElement> elements = from ele in doc.Elements("book")
                                             where (string)ele.Attribute("ISBN") == ISBN
                                                 select ele;
                 if (elements.Count() > 0)
                  elements.First().Remove();
               doc.Save(url);

             //删除所有
             //  IEnumerable<XElement> del = from ele in doc.Elements("book") select ele;
            IEnumerable<XElement> del = from ele in doc.Elements("book")
                                              select ele;
            if (del.Count() > 0)
                {
                    del.Remove();
                }
               doc.Save(url);

            */

            ///修改
            /// //dgvBookInfo.CurrentRow.Cells[1]对应着ISBN号
            IEnumerable<XElement> element = from ele in doc.Elements("book")
                                         where ele.Attribute("ISBN").Value == ISBN
                                           select ele;
            //判断是否有数据
           if (element.Count() > 0)
           {
               //获取查询的语句
               XElement first = element.First();
               ///设置新的属性
               first.SetAttributeValue("Type",bookModel.BookType);
               ///替换新的节点
               first.ReplaceNodes(
                       new XElement("title", bookModel.BookName),  
                        new XElement("author",bookModel.BookAuthor),
                        new XElement("price", bookModel.BookPrice) 
                        );
               doc.Save(@"..\..\Book.xml");
           }


        }


//使用Linq to XML.

//Linq是C#3.0中出现的一个新特性,使用它可以方便的操作许多数据源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比较简单.下面直接看代码,

//先定义 一个方法显示查询出来的数据
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="elements">查询语句</param>
        /// <returns></returns>
        public static List<BookModel> showInfoByElements(IEnumerable<XElement> elements)
        {
              List<BookModel> modelList = new List<BookModel>();
            foreach (var ele in elements)
             {
                  BookModel model = new BookModel();
                 model.BookAuthor = ele.Element("author").Value;
                  model.BookName = ele.Element("title").Value;
                model.BookPrice = Convert.ToDouble(ele.Element("price").Value);
                 model.BookISBN=ele.Attribute("ISBN").Value;
                model.BookType=ele.Attribute("Type").Value;
              modelList.Add(model);
           }

            return modelList;


     }


        /// <summary>
        /// 修改某个节点
        /// </summary>
        /// <param name="bookModel">类的数据</param>
        /// <param name="findIdName">节点的属性值</param>
        /// <param name="url">文件路径</param>
        private static void XiuGai(BookModel bookModel, string findIdName, string url)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(url);
            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
            string strPath = string.Format(findIdName);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
            selectXe.SetAttribute("Type", bookModel.BookType);//也可以通过SetAttribute来增加一个属性
            selectXe.GetElementsByTagName("title").Item(0).InnerText = bookModel.BookName;
            selectXe.GetElementsByTagName("author").Item(0).InnerText = bookModel.BookAuthor;
            selectXe.GetElementsByTagName("price").Item(0).InnerText = bookModel.BookPrice.ToString();
            xmlDoc.Save(url);
        }


        /// <summary>
        /// 删除指定节点中指定属性的数据
        /// </summary>
        /// <param name="url">xml文件路径</param>
        /// <param name="findIdName">寻找指定属性的地址</param>
        private static void DeleteXml(string url,string findIdName)
        {
            //想要删除某一个结点,直接找到其父结点,然后调用RemoveChild方法即可,现在关键的问题是如何找到这个结点,上面的SelectSingleNode可以传入一个Xpath表,我们通过书的ISBN号来找到这本书所在的结点.如下:
            XmlDocument doc = new XmlDocument();
            doc.Load(url);
            XmlElement xe = doc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
            string strPath = string.Format(findIdName);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
            selectXe.ParentNode.RemoveChild(selectXe);
            doc.Save(url);
        }

        /// <summary>
        /// 覆盖修改
        /// </summary>
        /// <param name="url"></param>
        /// <param name="bookModel"></param>
        private static void Modify(string url, BookModel bookModel)
        {
            //加载文件并选出要结点:
            XmlDocument doc = new XmlDocument();
            doc.Load(url);

           // XmlNode root = doc.SelectSingleNode("bookstore");

            //创建一个结点,并设置结点的属性:
            XmlElement xelKey = doc.CreateElement("book");
            XmlAttribute Type = doc.CreateAttribute("Type");
            Type.InnerText = bookModel.BookType;
            xelKey.SetAttributeNode(Type); //添加节点book属性 Type="adfdsf"
            XmlAttribute ISBN = doc.CreateAttribute("ISBN");
            ISBN.InnerText = bookModel.BookISBN;
            xelKey.SetAttributeNode(ISBN); //添加节点book属性 ISBN="7-111-19149-1"

            //  创建子结点:
            XmlElement title = doc.CreateElement("title");//赋值的节点
            title.InnerText = bookModel.BookName;//赋值内容
            xelKey.AppendChild(title);
            XmlElement author = doc.CreateElement("author");//赋值的节点
            author.InnerText = bookModel.BookAuthor;//赋值内容
            xelKey.AppendChild(author);
            XmlElement price = doc.CreateElement("price");//赋值的节点
            price.InnerText = bookModel.BookPrice.ToString();//赋值内容
            xelKey.AppendChild(price);

            //最后把book结点挂接在要结点上,并保存整个文件:AppendChild插入的意思
            XmlElement root = doc.CreateElement("bookstore");
                     root.AppendChild(xelKey);

            //用上面的方法,是向已有的文件上追加数据,如果想覆盖原有的所有数据,可以更改一下,使用LoadXml方法:
            doc.LoadXml("<bookstore>"+root.InnerXml+"</bookstore>");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据
            doc.Save(url);
         

        }


        /// <summary>
        /// 类添加到xml文件中
        /// </summary>
        /// <param name="url">文件路径</param>
        /// <param name="bookModel">有数据的类</param>
        private static void AddXml(string url, BookModel bookModel)
        {
            //加载文件并选出要结点:
            XmlDocument doc = new XmlDocument();
            doc.Load(url);

            XmlNode root = doc.SelectSingleNode("bookstore");

            //创建一个结点,并设置结点的属性:
            XmlElement xelKey = doc.CreateElement("book");

            XmlAttribute Type = doc.CreateAttribute("Type");
            Type.InnerText = bookModel.BookType;
            xelKey.SetAttributeNode(Type); //添加节点book属性 Type="adfdsf"
            XmlAttribute ISBN = doc.CreateAttribute("ISBN");
            ISBN.InnerText = bookModel.BookISBN;
            xelKey.SetAttributeNode(ISBN); //添加节点book属性 ISBN="7-111-19149-1"

            //  创建子结点:
            XmlElement title = doc.CreateElement("title");//赋值的节点
            title.InnerText = bookModel.BookName;//赋值内容
            xelKey.AppendChild(title);
            XmlElement author = doc.CreateElement("author");//赋值的节点
            author.InnerText = bookModel.BookAuthor;//赋值内容
            xelKey.AppendChild(author);
            XmlElement price = doc.CreateElement("price");//赋值的节点
            price.InnerText = bookModel.BookPrice.ToString();//赋值内容
            xelKey.AppendChild(price);
            //最后把book结点挂接在要结点上,并保存整个文件:拼接节点
            root.AppendChild(xelKey);
            doc.Save(url);
        }


        /// <summary>
        /// 解析Xml
        /// </summary>
        /// <param name="url">文件路径</param>
        /// <returns>list类</returns>
        private static List<BookModel> GetXml(string url)
        {
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreComments = true;//忽略文档里面的注释
            XmlReader reader = XmlReader.Create(url, settings);
            xmlDoc.Load(reader);
            reader.Close();
            // 得到根节点bookstore
            XmlNode xn = xmlDoc.SelectSingleNode("bookstore");
            // 得到根节点的所有子节点
            XmlNodeList xnl = xn.ChildNodes;

            List<BookModel> ListBookModel = new List<BookModel>();

            foreach (XmlNode xn1 in xnl)
            {
                BookModel bookModel = new BookModel();
                // 将节点转换为元素,便于得到节点的属性值
                XmlElement xe = (XmlElement)xn1;
                // 得到Type和ISBN两个属性的属性值
                bookModel.BookISBN = xe.GetAttribute("ISBN").ToString();
                bookModel.BookType = xe.GetAttribute("Type").ToString();

                // 得到Book节点的所有子节点,并赋值到类里面
                XmlNodeList xnl0 = xe.ChildNodes;
                bookModel.BookName = xnl0.Item(0).InnerText;
                bookModel.BookAuthor = xnl0.Item(1).InnerText;
                bookModel.BookPrice = Convert.ToDouble(xnl0.Item(2).InnerText);

                ListBookModel.Add(bookModel);
            }
            
            return ListBookModel;
        }

    }

以上与原文有区别,主要是对方法进行提取出来了,直接调用。

转载自:https://www.cnblogs.com/wt627939556/p/6646752.html    http://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html

本测试程序源码:VS工具:https://download.csdn.net/download/weixin_42401291/10799967

qq联系:1174787689

猜你喜欢

转载自blog.csdn.net/weixin_42401291/article/details/84334216