大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > C#操作XML方法集合

C#操作XML方法集合

关键词:集合操作方法XML  阅读(1194) 赞(20)

[摘要]本文主要介绍C#操作XML的方法集合,让你轻松操作XML文件。

一 前言

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

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

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

二 具体操作(C#)

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

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

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

然后得到如下的XML树

 <?xml version="1.0" encoding="utf-8"?>
 <BookStore>
     <Book>
         <Name BookName="C#">C#入门</Name>
         <Author Name="Martin">Martin</Author>
         <Date>2013-10-11</Date>
         <Adress>上海</Adress>
         <Date>2013-10-11</Date>
     </Book>
     <Book>
         <Name BookName="WCF">WCF入门</Name>
         <Author Name="Mary">Mary</Author>
         <Adress>北京</Adress>
         <Date>2013-10-11</Date>
     </Book>
 </BookStore>

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

2.1 新增节点与属性

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

         public void Create(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             
             var root = xmlDoc.DocumentElement;//取到根结点
             XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", "");
             newNode.InnerText = "WPF";
 
             //添加为根元素的第一层子结点
             root.AppendChild(newNode);
             xmlDoc.Save(xmlPath);
         }

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

         //属性
         public void CreateAttribute(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             var root = xmlDoc.DocumentElement;//取到根结点
             XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
             node.SetAttribute("Name", "WPF");
             xmlDoc.Save(xmlPath);
 
         }

效果如下

2.2 删除节点与属性

         public void Delete(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             var root = xmlDoc.DocumentElement;//取到根结点
 
             var element = xmlDoc.SelectSingleNode("BookStore/NewBook");
             root.RemoveChild(element);
             xmlDoc.Save(xmlPath);
         }

删除属性

         public void DeleteAttribute(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
             //移除指定属性
             node.RemoveAttribute("Name");
             //移除当前节点所有属性,不包括默认属性
             //node.RemoveAllAttributes();
             xmlDoc.Save(xmlPath);
         }

2.3 修改节点与属性

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

修改属性代码如下

         public void ModifyAttribute(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
             element.SetAttribute("Name", "Zhang");
             xmlDoc.Save(xmlPath);
         }

效果如下

2.4 获取节点与属性

         public void Select(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             //取根结点
             var root = xmlDoc.DocumentElement;//取到根结点
             //取指定的单个结点
             XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook");
             
             //取指定的结点的集合
             XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook");
 
             //取到所有的xml结点
             XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*");
         }

属性

         public void SelectAttribute(string xmlPath)
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(xmlPath);
             XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
             string name = element.GetAttribute("Name");
             Console.WriteLine(name);
         }

三 具体操作 (linq to XML)

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

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

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

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

3.1 新增节点与属性

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

3.2 删除节点与属性

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

3.3 修改节点属性

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

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

         public void ModifyAttribute(string xmlPath)
         {
             XDocument xDoc = XDocument.Load(xmlPath);
             XElement element = xDoc.Element("BookStore").Element("Book");
             element.SetAttributeValue("BookName","ZeryTest");
             xDoc.Save(xmlPath);
         }

四 总结

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

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

成长在于积累!

Demo 源码

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

        }


    }
}


相关评论