C#操作XML方法集合

 

一 前言

先来了解下操作XML所涉及到的几个类及之间的关系  如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家

* 1 XMLElement 主要是针对节点的一些属性进行操作
* 2 XMLDocument 主要是针对节点的CUID操作
* 3 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法

 

 

C#操作XML方法集合

清楚了以上的关系在操作XML时会更清晰一点

 

二 具体操作(C#)

  以下会对Xml的结点与属性做增 删 改 查的操作也满足了实际工作中的大部分情况 

先构造一棵XML树如下,其中也涉及到了写入xml文档的操作

 

 1         public void CreatXmlTree(string xmlPath)

 2         {

 3             XElement xElement = new XElement(

 4                 new XElement("BookStore",

 5                     new XElement("Book",

 6                         new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),

 7                         new XElement("Author", "Martin", new XAttribute("Name", "Martin")),

 8                         new XElement("Adress", "上海"),

 9                         new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))

10                         ),

11                     new XElement("Book",

12                         new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")),

13                         new XElement("Author", "Mary", new XAttribute("Name", "Mary")),

14                         new XElement("Adress", "北京"),

15                         new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))

16                         )

17                         )

18                 );

19 

20             //需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常

21             XmlWriterSettings settings = new XmlWriterSettings();

22             settings.Encoding = new UTF8Encoding(false);

23             settings.Indent = true;

24             XmlWriter xw = XmlWriter.Create(xmlPath,settings);

25             xElement.Save(xw);

26             //写入文件

27             xw.Flush();

28             xw.Close();

29         }

 

然后得到如下的XML树

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <BookStore>

 3     <Book>

 4         <Name BookName="C#">C#入门</Name>

 5         <Author Name="Martin">Martin</Author>

 6         <Date>2013-10-11</Date>

 7         <Adress>上海</Adress>

 8         <Date>2013-10-11</Date>

 9     </Book>

10     <Book>

11         <Name BookName="WCF">WCF入门</Name>

12         <Author Name="Mary">Mary</Author>

13         <Adress>北京</Adress>

14         <Date>2013-10-11</Date>

15     </Book>

16 </BookStore>

 

以下操作都是对生成的XML树进行操作

2.1 新增节点与属性

新增节点NewBook并增加属性Name="WPF"

 1         public void Create(string xmlPath)

 2         {

 3             XmlDocument xmlDoc = new XmlDocument();

 4             xmlDoc.Load(xmlPath);

 5             

 6             var root = xmlDoc.DocumentElement;//取到根结点

 7             XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", "");

 8             newNode.InnerText = "WPF";

 9 

10             //添加为根元素的第一层子结点

11             root.AppendChild(newNode);

12             xmlDoc.Save(xmlPath);

13         }

 

 开篇有写操作xml节点属性主要用XmlElement对象所以取到结点后要转类型 

 1         //属性

 2         public void CreateAttribute(string xmlPath)

 3         {

 4             XmlDocument xmlDoc = new XmlDocument();

 5             xmlDoc.Load(xmlPath);

 6             var root = xmlDoc.DocumentElement;//取到根结点

 7             XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

 8             node.SetAttribute("Name", "WPF");

 9             xmlDoc.Save(xmlPath);

10 

11         }

 

 效果如下

C#操作XML方法集合

 

2.2 删除节点与属性

 1         public void Delete(string xmlPath)

 2         {

 3             XmlDocument xmlDoc = new XmlDocument();

 4             xmlDoc.Load(xmlPath);

 5             var root = xmlDoc.DocumentElement;//取到根结点

 6 

 7             var element = xmlDoc.SelectSingleNode("BookStore/NewBook");

 8             root.RemoveChild(element);

 9             xmlDoc.Save(xmlPath);

10         }

删除属性

 1         public void DeleteAttribute(string xmlPath)

 2         {

 3             XmlDocument xmlDoc = new XmlDocument();

 4             xmlDoc.Load(xmlPath);

 5             XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

 6             //移除指定属性

 7             node.RemoveAttribute("Name");

 8             //移除当前节点所有属性,不包括默认属性

 9             //node.RemoveAllAttributes();

10             xmlDoc.Save(xmlPath);

11         }

 

2.3 修改节点与属性

   xml的节点默认是不允许修改的,本文也就不做处理了

  修改属性代码如下

1         public void ModifyAttribute(string xmlPath)

2         {

3             XmlDocument xmlDoc = new XmlDocument();

4             xmlDoc.Load(xmlPath);

5             XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

6             element.SetAttribute("Name", "Zhang");

7             xmlDoc.Save(xmlPath);

8         }

效果如下

C#操作XML方法集合

2.4 获取节点与属性

 1         public void Select(string xmlPath)

 2         {

 3             XmlDocument xmlDoc = new XmlDocument();

 4             xmlDoc.Load(xmlPath);

 5             //取根结点

 6             var root = xmlDoc.DocumentElement;//取到根结点

 7             //取指定的单个结点

 8             XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook");

 9             

10             //取指定的结点的集合

11             XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook");

12 

13             //取到所有的xml结点

14             XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*");

15         }

属性

1         public void SelectAttribute(string xmlPath)

2         {

3             XmlDocument xmlDoc = new XmlDocument();

4             xmlDoc.Load(xmlPath);

5             XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

6             string name = element.GetAttribute("Name");

7             Console.WriteLine(name);

8         }

 

 

三  具体操作 (linq to XML)

 Linq to Xml 也没什么变化只操作对象改变了主要涉及的几个对象如下   注:我并没有用linq的语法去操作元素

XDocument:用于创建一个XML实例文档

XElement:用于一些节点与节点属性的基本操作

以下是对Xml的 一些简单的操作

3.1 新增节点与属性

1         public void Create(string xmlPath)

2         {

3             XDocument xDoc = XDocument.Load(xmlPath);

4             XElement xElement = xDoc.Element("BookStore");

5             xElement.Add(new XElement("Test", new XAttribute("Name", "Zery")));

6             xDoc.Save(xmlPath);

7         }

属性

 1         public void CreateAttribute(string xmlPath)

 2         {

 3             XDocument xDoc = XDocument.Load(xmlPath);

 4             IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book");

 5             foreach (var element in xElement)

 6             {

 7                 element.SetAttributeValue("Name", "Zery");

 8             }

 9             xDoc.Save(xmlPath);

10         }

 

3.2 删除节点与属性

1         public void Delete(string xmlPath)

2         {

3             XDocument xDoc = XDocument.Load(xmlPath);

4             XElement element = (XElement)xDoc.Element("BookStore").Element("Book");

5             element.Remove();

6             xDoc.Save(xmlPath);

7         }

属性

1         public void DeleteAttribute(string xmlPath)

2         {

3             XDocument xDoc = XDocument.Load(xmlPath);

4             //不能跨级取节点

5             XElement element = xDoc.Element("BookStore").Element("Book").Element("Name");

6             element.Attribute("BookName").Remove();

7             xDoc.Save(xmlPath);

8         }

3.3 修改节点属性

节点.net没提供修改的方法本文也不做处理

修改属性与新增实质是同一个方法

1         public void ModifyAttribute(string xmlPath)

2         {

3             XDocument xDoc = XDocument.Load(xmlPath);

4             XElement element = xDoc.Element("BookStore").Element("Book");

5             element.SetAttributeValue("BookName","ZeryTest");

6             xDoc.Save(xmlPath);

7         }

 

 四 总结

  把文章写完时,又扫去了自己的一个盲区,虽然都是些简单的操作,但在实际的开中,又何尝不是由简单到复杂呢。我觉得身为程序员就应该遇到自己的盲区时,立马花时间去了解,不说要了解多深入,但至少基本的还是要知道,等到工作中真需时,只要稍微花点时间就可以了。

如果觉得文章对你有点帮助,不妨点下推荐,你的推荐让我对写文章能有更多的激情!

成长在于积累!

 

Demo 源码

C#操作XML方法集合
using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Xml;

using System.Web;

using System.Xml.Linq;



namespace XMLOperation

{

    class Program

    {

        static void Main(string[] args)

        {

            /*=============Linq 读写XML==================*/

            string wxmlPath = @"F:\XmlTest\test.xml";

            XmlWriteReadLinqOperation writeReadLinq = new XmlWriteReadLinqOperation();

            // writeReadLinq.WriteXml(wxmlPath);

            writeReadLinq.CreatXmlTree(wxmlPath);









            //string xmlPath = @"F:\XML.xml";

            string xmlPath = @"C:\Users\zery.zhang\Desktop\ProjectDemo\XML.xml";

            /*

             * 1 三者之间的关系用图画出

             * 2 XMLElement 主要是针对节点的一些属性进行操作

             * 3 XMLDocument 主要是针对节点的CUID操作

             * 4 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法 

             */



            //===========C# to Xml==========//

            XmlOperation xmlOperation = new XmlOperation();

            //xmlOperation.Create(xmlPath);

            //xmlOperation.CreateAttribute(xmlPath);



            //xmlOperation.Delete(xmlPath);

            //xmlOperation.DeleteAttribute(xmlPath);



            //xmlOperation.Modify(xmlPath);

            //xmlOperation.ModifyAttribute(xmlPath);



            //xmlOperation.Select(xmlPath);

            //xmlOperation.SelectAttribute(xmlPath);

            /*=============Linq to Xml===========*/

            XmlOperationToLinq xOperation = new XmlOperationToLinq();

            // xOperation.Create(xmlPath);

            /*

             *1 给指定的XML节点的所有子节点增加一个节点,并增加属性

             *2 删除指定节点的子节点的指定属性

             *3 

             */

            string lxmlPath = @"F:\XmlTest\test.xml";

            xOperation.Create(lxmlPath);

            xOperation.CreateAttribute(lxmlPath);

            //xperation.Delete(lxmlPath);

            //xOperation.DeleteAttribute(lxmlPath);

           // xOperation.ModifyAttribute(lxmlPath);



            /*=============C# 读写XML===============*/

            XmlWriteReadOperation writeRead = new XmlWriteReadOperation();





            Console.Read();



        }



    }



    class XmlOperation

    {



        public void Create(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            var root = xmlDoc.DocumentElement;//取到根结点



            XmlNode newNode = xmlDoc.CreateNode("element", "Name", "");

            newNode.InnerText = "Zery";



            //添加为根元素的第一层子结点

            root.AppendChild(newNode);

            xmlDoc.Save(xmlPath);

        }

        //属性

        public void CreateAttribute(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");

            node.SetAttribute("Name", "C#");

            xmlDoc.Save(xmlPath);

        }



        public void Delete(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            var root = xmlDoc.DocumentElement;//取到根结点



            var element = xmlDoc.SelectSingleNode("Collection/Name");

            root.RemoveChild(element);

            xmlDoc.Save(xmlPath);

        }



        public void DeleteAttribute(string xmlPath)

        {

            

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");

            //移除指定属性

            node.RemoveAttribute("Name");

            //移除当前节点所有属性,不包括默认属性

            node.RemoveAllAttributes();



            xmlDoc.Save(xmlPath);



        }



        public void Modify(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            var root = xmlDoc.DocumentElement;//取到根结点

            XmlNodeList nodeList = xmlDoc.SelectNodes("/Collection/Book");

            //xml不能直接更改结点名称,只能复制然后替换,再删除原来的结点

            foreach (XmlNode node in nodeList)

            {

                var xmlNode = (XmlElement)node;

                xmlNode.SetAttribute("ISBN", "Zery");

            }

            xmlDoc.Save(xmlPath);



        }



        public void ModifyAttribute(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");

            element.SetAttribute("Name", "Zhang");

            xmlDoc.Save(xmlPath);



        }



        public void Select(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            //取根结点

            var root = xmlDoc.DocumentElement;//取到根结点

            //取指定的单个结点

            XmlNode singleNode = xmlDoc.SelectSingleNode("Collection/Book");



            //取指定的结点的集合

            XmlNodeList nodes = xmlDoc.SelectNodes("Collection/Book");



            //取到所有的xml结点

            XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*");

        }



        public void SelectAttribute(string xmlPath)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(xmlPath);

            XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");

            string name = element.GetAttribute("Name");

          

        }

    }



    class XmlOperationToLinq

    {

        //其它操作

        public void OtherOperaton()

        {

            //加文件头

        }







        public void Create(string xmlPath)

        {

            XDocument xDoc = XDocument.Load(xmlPath);

            XElement xElement = xDoc.Element("BookStore");

            xElement.Add(new XElement("Test", new XAttribute("Name", "Zery")));

            xDoc.Save(xmlPath);

        }



        public void CreateAttribute(string xmlPath)

        {

            XDocument xDoc = XDocument.Load(xmlPath);

            IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book");

            foreach (var element in xElement)

            {

                element.SetAttributeValue("Name", "Zery");

            }

            xDoc.Save(xmlPath);

        }

        

        public void Delete(string xmlPath)

        {

            XDocument xDoc = XDocument.Load(xmlPath);

            XElement element = (XElement)xDoc.Element("BookStore").Element("Book");

            element.Remove();

            xDoc.Save(xmlPath);

        }



        public void DeleteAttribute(string xmlPath)

        {

            XDocument xDoc = XDocument.Load(xmlPath);

            //不能跨级取节点

            XElement element = xDoc.Element("BookStore").Element("Book").Element("Name");

            element.Attribute("BookName").Remove();

            xDoc.Save(xmlPath);

        }



        public void ModifyAttribute(string xmlPath)

        {

            XDocument xDoc = XDocument.Load(xmlPath);

            XElement element = xDoc.Element("BookStore").Element("Book");

            element.SetAttributeValue("BookName","ZeryTest");

            xDoc.Save(xmlPath);

        }





    }



    internal class XmlWriteReadOperation

    {



    }





    class XmlWriteReadLinqOperation

    {





        public void CreatXmlTree(string xmlPath)

        {

            XElement xElement = new XElement(

                new XElement("BookStore",

                    new XElement("Book",

                        new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),

                        new XElement("Author", "Martin", new XAttribute("Name", "Martin")),

                        new XElement("Adress", "上海"),

                        new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))

                        ),

                    new XElement("Book",

                        new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")),

                        new XElement("Author", "Mary", new XAttribute("Name", "Mary")),

                        new XElement("Adress", "北京"),

                        new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))

                        )

                        )

                );



            //需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常

            XmlWriterSettings settings = new XmlWriterSettings();

            settings.Encoding = new UTF8Encoding(false);

            settings.Indent = true;

            XmlWriter xw = XmlWriter.Create(xmlPath,settings);

            xElement.Save(xw);

            //写入文件

            xw.Flush();

            xw.Close();

        }









        public void WriteXml(string xmlPath)

        {

            XElement xElement = new XElement(

                new XElement("Store",

                    new XElement("Book", "技术类",

                        new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),

                        new XElement("Author", "Martin", new XAttribute("Name", "Zery")),

                        new XComment("以下为注释"),//xml注释

                        new XElement("Date", DateTime.Now.ToString(), new XAttribute("PublicDate", DateTime.Now.ToString()))

                        ))

                );

       

            XmlWriter xw = XmlWriter.Create(xmlPath);

            //保存到XmlWriter

            xElement.Save(xw);

            //写入文件

            xw.Flush();

            xw.Close();



        }





    }

}
View Code

 

 

 

你可能感兴趣的:(xml)