1. 程式人生 > >C#對Xml的檔案操作

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