首页 > 代码库 > C#操作xml的3种方式

C#操作xml的3种方式

C#操作Xml有很多种方式,这里写出个人常使用的三种方式
XmlDocument
DataSet
linq to xml
 首先声明本次操作使用的xml文件:books.xml;内容如下
  
<?xml version="1.0" encoding="UTF-8"?><books>  <book display="书本记录">    <name>哈里波特</name>    <price>10</price>    <memo>这是一本很好看的书。</memo>  </book>  <book id="B02">    <name>三国演义</name>    <price>10</price>    <memo>四大名著之一。</memo>  </book>  <book id="B03">    <name>水浒</name>    <price>6</price>    <memo>四大名著之一。</memo>  </book>  <book id="B04">    <name>红楼</name>    <price>5</price>    <memo>四大名著之一。</memo>  </book></books>
View Code


以下代码只适用于测试学习,不适用于工程代码

1. XmlDocument【传统方式】

  直接上代码,暂时不做效率等对比
 
  
  
        /// <summary>        /// XmlDocument增删改查        /// </summary>        public static void XmlDocumentOP()        {            XmlElement theBook = null, theElem = null, root = null;            XmlDocument xmldoc = new XmlDocument();            try            {                xmldoc.Load("Books.xml");                root = xmldoc.DocumentElement;                //---  新建一本书开始 ----                  theBook = xmldoc.CreateElement("book");                theElem = xmldoc.CreateElement("name");                theElem.InnerText = "新书";                theBook.AppendChild(theElem);                theElem = xmldoc.CreateElement("price");                theElem.InnerText = "20";                theBook.AppendChild(theElem);                theElem = xmldoc.CreateElement("memo");                theElem.InnerText = "新书更好看。";                theBook.AppendChild(theElem);                root.AppendChild(theBook);                Console.Out.WriteLine("---  新建一本书开始 ----");                Console.Out.WriteLine(root.OuterXml);                //---  新建一本书完成 ----                  //---  下面对《哈里波特》做一些修改。 ----                  //---  查询找《哈里波特》----                  theBook = (XmlElement)root.SelectSingleNode("/books/book[name=‘哈里波特‘]");                Console.Out.WriteLine("---  查找《哈里波特》 ----");                Console.Out.WriteLine(theBook.OuterXml);                //---  此时修改这本书的价格 -----                  theBook.GetElementsByTagName("price").Item(0).InnerText = "15";//getElementsByTagName返回的是NodeList,所以要跟上item(0)。另外,GetElementsByTagName("price")相当于SelectNodes(".//price")。                  Console.Out.WriteLine("---  此时修改这本书的价格 ----");                Console.Out.WriteLine(theBook.OuterXml);                //---  另外还想加一个属性id,值为B01 ----                  theBook.SetAttribute("id", "B01");                Console.Out.WriteLine("---  另外还想加一个属性id,值为B01 ----");                Console.Out.WriteLine(theBook.OuterXml);                //---  对《哈里波特》修改完成。 ----                  //---  再将所有价格低于10的书删除  ----                  theBook = (XmlElement)root.SelectSingleNode("/books/book[@id=‘B02‘]");                Console.Out.WriteLine("---  要用id属性删除《三国演义》这本书 ----");                Console.Out.WriteLine(theBook.OuterXml);                theBook.ParentNode.RemoveChild(theBook);                Console.Out.WriteLine("---  删除后的XML ----");                Console.Out.WriteLine(xmldoc.OuterXml);                //---  再将所有价格低于10的书删除  ----                  XmlNodeList someBooks = root.SelectNodes("/books/book[price<10]");                Console.Out.WriteLine("---  再将所有价格低于10的书删除  ---");                Console.Out.WriteLine("---  符合条件的书有 " + someBooks.Count + "本。  ---");                for (int i = 0; i < someBooks.Count; i++)                {                    someBooks.Item(i).ParentNode.RemoveChild(someBooks.Item(i));                }                Console.Out.WriteLine("---  删除后的XML ----");                Console.Out.WriteLine(xmldoc.OuterXml);                xmldoc.Save("books.xml");//保存到books.xml                  Console.In.Read();            }            catch (Exception e)            {                Console.Out.WriteLine(e.Message);            }        }
View Code

  以上代码来源于网络测试可行,作者忘记了

2. DataSet 操作xml【常用方式】

    比较常用,方便快捷,类似操作数据库一样顺手
 
  
        /// <summary>        /// DataSet操作xml        /// </summary>        public static void XmlDataSetOP()        {            DataSet ds = new DataSet();            ds.ReadXml("books.xml");            /*                <books>                  <book display="书本记录">                    <name>哈里波特</name>                    <price>10</price>                    <memo>这是一本很好看的书。</memo>                  </book>                  <book id="B02">                    <name>三国演义</name>                    <price>10</price>                    <memo>四大名著之一。</memo>                  </book>                  <book1 id="B04">                    <name>红楼</name>                    <price>5</price>                    <memo>四大名著之一。</memo>                  </book1>                </books>             */            //ds 是多表集合,根节点没有实际意义,这样会生成两个数据表:book 和 book1            //book 表包含了子节点及属性所有节点的字段            //即 name        price  memo         display   id                //   哈里波特    10     这是…书。   书本记录  B01            //   三国演义    10     四大…之一。           B02                //注意如果以上子节点含有属性,可能会建立关系表,如<name provice="english">哈里波特</name> 比较复杂            DataTable dt = ds.Tables["book"];            //查找数据            //1. 查询价格等于10的row记录            var row = dt.Select("price = 10");            //2. 查询价格等于10的记录 并且 name是 哈里波特的            var row1 = dt.Select("price = 10 and name = ‘哈里波特‘");            //3.将DataTable 实现IEnumerable接口,AsEnumerable(),然后使用linq查询            var ss = from rowData in dt.AsEnumerable().Where(r => r["price"].ToString() == "10")                     where 1 == 1                     select new { a = rowData["name"].ToString() };            //增加数据            dt.Rows.Add(new object[] { "aaa", 10, 11 });//注意这里请按照字段顺序编写,字段顺序:book子节点、book属性            //ds.GetXml();可直接输出当前最新xml,保存即可            //移除了这个条件下的记录            foreach (var item in dt.Select("price=10"))            {                dt.Rows.Remove(item);            }            //改,            var cRow = dt.Select("name=‘水浒‘");            if (cRow.Count() > 0)            {                cRow[0].BeginEdit();                cRow[0]["name"] = "水浒传";                cRow[0]["price"] = "20";                cRow[0].EndEdit();            }        }
View Code

3. linq to Xml【比较人性化方式,据说效率最佳】   

 

    class Book    {        public string ID { get; set; }        public string Display { get; set; }        public string Name { get; set; }        public string Price { get; set; }        public string Memo { get; set; }        private static XDocument doc = new XDocument();        public static string filePath = "books.xml";        public Book()        {            doc = XDocument.Load(filePath);        }        public Book(string filepath)        {            filePath = filepath;            doc = XDocument.Load(filePath);        }        /// <summary>        ////// </summary>        /// <returns></returns>        public bool Add()        {            XElement db = new XElement("book",               new XAttribute("id", Guid.NewGuid().ToString()),               new XAttribute("display", Display),               new XElement("name", Name),               new XElement("price", Price),               new XElement("memo", Memo)               );            try            {                //用XElement的Add方法                //XElement doc = XElement.Load(filePath);                //doc.Add(db);                //用XDocument的Add方法                doc.Element("books").Add(db);                doc.Save(filePath);                return true;            }            catch            {                return false;            }        }        /// <summary>        ////// </summary>        /// <param name="id"></param>        /// <returns></returns>        public static bool RemoveData(string id)        {            XElement xe = (from db in doc.Element("books").Elements("book")                           where (db.Attribute("id") == null ? "" : db.Attribute("id").Value) == id                           select db).Single() as XElement;            try            {                xe.Remove();                doc.Save(filePath);                return true;            }            catch            {                return false;            }        }        /// <summary>        ////// </summary>        /// <returns></returns>        public bool Update()        {            XElement xe = (from db in doc.Element("books").Elements("book")                           where (db.Attribute("id") == null ? "" : db.Attribute("id").Value.ToString()) == ID                           select db).Single();            try            {                xe.Attribute("display").Value =http://www.mamicode.com/ Display;                xe.Element("name").Value =http://www.mamicode.com/ Name;                xe.Element("price").Value =http://www.mamicode.com/ Price;                xe.Element("memo").Value =http://www.mamicode.com/ Memo;                doc.Save(filePath);                return true;            }            catch            {                return false;            }        }        /// <summary>        ////// </summary>        /// <returns></returns>        public List<Book> GetAll()        {            List<Book> dbs = (from db in doc.Element("books").Elements("book")                              select new Book                              {                                  ID = db.Attribute("id") == null ? "" : db.Attribute("id").Value.ToString(),                                  Display = db.Attribute("display") == null ? "" : db.Attribute("display").Value.ToString(),                                  Name = db.Element("name") == null ? "" : db.Element("name").Value.ToString(),                                  Price = db.Element("price") == null ? "" : db.Element("name").Value.ToString(),                                  Memo = db.Element("memo") == null ? "" : db.Element("name").Value.ToString()                              }).ToList();            return dbs;        }        /// <summary>        ////// </summary>        /// <returns></returns>        public List<Book> TakePage(out int totalSize, int index, int size)        {            List<Book> dbs = (from db in doc.Element("books").Elements("book")                              select new Book                              {                                  ID = db.Attribute("id") == null ? "" : db.Attribute("id").Value.ToString(),                                  Display = db.Attribute("display") == null ? "" : db.Attribute("display").Value.ToString(),                                  Name = db.Element("name") == null ? "" : db.Element("name").Value.ToString(),                                  Price = db.Element("price") == null ? "" : db.Element("name").Value.ToString(),                                  Memo = db.Element("memo") == null ? "" : db.Element("name").Value.ToString()                              }).Skip((index - 1) * size).Take(size).ToList();            totalSize = GetAll().Count;            return dbs;        }        /// <summary>        ////// </summary>        /// <returns></returns>        public List<Book> GetSingleBook(string id)        {            List<Book> dbs = (from db in doc.Element("books").Elements("book")                              where (db.Attribute("id") == null ? "" : db.Attribute("id").Value.ToString()) == id                              select new Book                              {                                  ID = db.Attribute("id") == null ? "" : db.Attribute("id").Value.ToString(),                                  Display = db.Attribute("display") == null ? "" : db.Attribute("display").Value.ToString(),                                  Name = db.Element("name") == null ? "" : db.Element("name").Value.ToString(),                                  Price = db.Element("price") == null ? "" : db.Element("name").Value.ToString(),                                  Memo = db.Element("memo") == null ? "" : db.Element("name").Value.ToString()                              }).ToList();            return dbs;        }    }
View Code

 

C#操作xml的3种方式