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>

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

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);
            }

        }

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

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();
            }

        }

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 = Display;
                xe.Element("name").Value = Name;
                xe.Element("price").Value = Price;
                xe.Element("memo").Value = 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;
        }
    }

时间: 2024-11-05 22:50:45

C#操作xml的3种方式的相关文章

android操作XML的几种方式(转)

XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现.其标准型,可靠性,安全性......毋庸置疑.在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件. 小提示:android中存储数据一般有如下几种:SharedPreferences(参数化),XML文件,sqllite数据库,网络,ContentProvider(内容提供者)等. 在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等.

简介C#读取XML的两种方式

简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询 XML作用 对于XML,想必各位都比较了解,我也就不用费笔墨来描述它是什么了,我想在未来的Web开发中XML一定会大放异彩,XML是可扩展标记语言,使用它企 业可以制定一套自己的数据格式.用于Internet的数据

解析XML的4种方式及优缺点比较

dom, sax是解析xml的底层接口 而jdom和dom4j则是基于底层api的更高级封装    dom是通用的,而jdom和dom4j则是面向java语言的 (方法一). DOM解析说明:为 XML 文档的已解析版本定义了一组接口.解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构.优点:整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能:缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间:使用场合:一旦解析了文档还需多次

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

java解析xml文件四种方式介绍、性能比较和基本使用方法

一.介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不

通过编码和xml文件两种方式实现tween动画

tween有四种动画效果:alpha(透明).rotate(旋转), translate(移动),scale(缩放); 可以通过硬编码和xml文件这两种方式来实现. xml实现: 第一步:在项目的res文件下面新建一个文件夹名字是anim(必须) 第二步:在anim文件夹下面新建新的xml文件,在xml文件中具体设置动画效果 第三步:在Activity中使用 AnimationUtils.loadAnimation(MainActivity.this,R.anim.xx);来获取. 1.alph

Android开发之使用sqlite3工具操作数据库的两种方式

使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/fengyuzhengfan/article/details/40193123 在Android SDK的tools目录下提供了一"sqlite3.exe工具,它是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口在有些时候,开发者利用该工具来査询. 管理数据库. 下面介绍两种方式: 第

js最基础知识回顾2(函数传参,操作属性的第二种方式,提取行间事件,操作一组元素,this,焦点问题和鼠标按下抬起,选项卡)

一.函数传参     1.函数传参:参数就是占位符----函数里定不下来的东西 a. var a1=function(){ alert(123); }; function a(f){ // 相当于 f=a1 f(); }; a(a1); b.  function skip(skipPath){  //换肤 var oLink1 = document.getElementById('link1'); oLink1.href=skipPath; } c.   function setStyle(na

Android处理XML的三种方式

http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html http://blog.csdn.net/zzp16/article/details/7795410 http://www.ibm.com/developerworks/cn/xml/x-android/ http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html http://mobile.