• C#操作XML方式


    系列目录

    前言#

    前一篇XML读取,现在咱们继续XML操作相关

    C#中也有三种操作(增、删、改、查)XML文件方法如下:

    1. 使用 XmlDocument(DOM模式)
    2. 使用 XmlTextWriter(流模式)
    3. 使用 Linq to Xml(Linq模式)

    使用XmlDocument方式操作#

    增加节点##

    向文件中添加新的数据的时候,首先也是通过XmlDocument加载整个文档,然后通过调用SelectSingleNode方法获得根结点,通过CreateElement方法创建元素,用CreateAttribute创建属性,用AppendChild把当前结点挂接在其它结点上,用SetAttributeNode设置结点的属性.具体代码如下:

    #region XmlDocument创建或者插入节点
    
    /// <summary>
    /// 向文件中添加新的数据的时候,
    /// 首先也是通过XmlDocument加载整个文档,
    /// 然后通过调用SelectSingleNode方法获得根结点,
    /// 通过CreateElement方法创建元素,
    /// 用CreateAttribute创建属性,
    /// 用AppendChild把当前结点挂接在其它结点上,
    /// 用SetAttributeNode设置结点的属性.具体代码如下:
    /// </summary>
    public static void XmlDocumentCreateInsertDemo()
    {
        //加载文件并选出要结点:
        XmlDocument doc = new XmlDocument();
        doc.Load(@"d:/demo.xml");
        XmlNode root = doc.SelectSingleNode("bookstore");
        //创建一个结点,并设置结点的属性:
        XmlElement xelKey = doc.CreateElement("test");
        XmlAttribute xelType = doc.CreateAttribute("Type");
        xelType.Value = "testvalue";
        xelKey.SetAttribute("Type", "testvalue2");
        xelKey.SetAttributeNode(xelType);
        //注释节点
        XmlComment xco = doc.CreateComment("这是注释");
        //内容节点
        XmlElement xelAuthor = doc.CreateElement("author");
        xelAuthor.InnerText = "sss";
        xelKey.AppendChild(xelAuthor);
        xelKey.AppendChild(xco);
        root.AppendChild(xelKey);
        doc.Save(@"d:/demov2.xml");
    }
    
    #endregion XmlDocument创建或者插入节点
    

    删除、修改##

    想要删除某一个结点,直接找到其父结点,然后调用RemoveChild方法即可,现在关键的问题是如何找到这个结点,上面的SelectSingleNode可以传入一个Xpath表,我们通过书的ISBN号来找到这本书所在的结点

    修改某 条数据的话,首先也是用Xpath表达式找到所需要修改的那一个结点,然后如果是元素的话,就直接对这个元素赋值,如果是属性的话,就用SetAttribute方法设置即可

    #region XmlDocument 查找删除修改
    
    /// <summary>
    /// 想要删除某一个结点,直接找到其父结点,
    /// 然后调用RemoveChild方法即可,现在关键的问题是如何找到这个结点,
    /// 上面的SelectSingleNode可以传入一个Xpath表,
    /// 我们通过书的ISBN号来找到这本书所在的结点
    /// </summary>
    public static void XmlDocumentSeachDelUpdateDemo()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(@"d:/demo.xml");
        XmlNode root = doc.DocumentElement;
        string strPath = string.Format("/bookstore/book[@ISBN="{0}"]", "7-111-19149-6");
        XmlElement selectXe = (XmlElement)root.SelectSingleNode(strPath);
        //删除
        //selectXe.ParentNode.RemoveChild(selectXe);
        selectXe.SetAttribute("Type", "asdfasdf");//也可以通过SetAttribute来增加一个属性
        selectXe.SetAttribute("Typeasdf", "wxcd");//也可以通过SetAttribute来增加一个属性
        selectXe.GetElementsByTagName("title").Item(0).InnerText = "33ee";
        XmlElement appxle = doc.CreateElement("windy");
        appxle.InnerText = "wwws";
        selectXe.AppendChild(appxle);
        doc.Save(@"d:/demod.xml");
    }
    
    #endregion XmlDocument 查找删除修改
    

    "/bookstore/book[@ISBN="{0}"]"是一个Xpath表达式,找到ISBN号为所选那一行ISBN号的那本书,有关Xpath的知识请参考:XPath 语法

    使用XmlTextWriter方式操作#

    XmlTextWriter写文件的时候,默认是覆盖以前的文件,如果此文件名不存在,它将创建此文件.首先设置一下,你要创建的XML文件格式.

       1: XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"....Book1.xml", null);
       2: //使用 Formatting 属性指定希望将 XML 设定为何种格式。 这样,子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。
       3: myXmlTextWriter.Formatting = Formatting.Indented;
    

    然后可以通过WriteStartElement和WriteElementString方法来创建元素,这两者的区别就是如果有子结点的元素,那么创建的时候就用WriteStartElement,然后去创建子元素,创建完毕后,要调用相应的WriteEndElement来告诉编译器,创建完毕,用WriteElementString来创建单个的元素,用WriteAttributeString来创建属性.如下:

    #region XmlTextWriterDemo
    
    /// <summary>
    /// 然后可以通过WriteStartElement和WriteElementString方法来创建元素,
    /// 这两者的区别就是如果有子结点的元素,那么创建的时候就用WriteStartElement,
    /// 然后去创建子元素,创建完毕后,要调用相应的WriteEndElement来告诉编译器,创建完毕,
    /// 用WriteElementString来创建单个的元素,用WriteAttributeString来创建属性
    /// </summary>
    public static void XmlTextWriterDemo()
    {
        XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"d:/demoWriter.xml", null);
        //使用 Formatting 属性指定希望将 XML 设定为何种格式。 这样,子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。
        myXmlTextWriter.Formatting = Formatting.Indented;
        myXmlTextWriter.WriteStartDocument(true);
        myXmlTextWriter.WriteStartElement("root");
        myXmlTextWriter.WriteComment("我测试XML编写");
        myXmlTextWriter.WriteStartElement("person");
        myXmlTextWriter.WriteAttributeString("name", "windy");
        myXmlTextWriter.WriteAttributeString("age", "20");
        myXmlTextWriter.WriteElementString("city", "wuxi");
        myXmlTextWriter.WriteEndElement();
        myXmlTextWriter.WriteEndElement();
        myXmlTextWriter.Flush();
        myXmlTextWriter.Close();
    }
    
    #endregion XmlTextWriterDemo
    

    使用Linq to Xml方式操作#

    插入一条数据##

    #region 插入一条数据
    
    XElement xe = XElement.Load(@"d:/demoLinq.xml");
    XElement record = new XElement(
        new XElement("root",
        new XElement("book",
        new XAttribute("Type", "选修课"),
        new XAttribute("ISBN", "7-111-19149-1"),
        new XElement("title", "计算机操作系统"),
        new XElement("author", "7-111-19149-1"),
        new XElement("price", 28.00))));
    xe.Add(record);
    record.Save(@"d:/demoLinq.xml");
    
    #endregion 插入一条数据
    

    修改某一记录##

    #region 修改某一记录
    
    //注意:xml必须需要根节点
    XElement xe = XElement.Load(@"d:/demoLinq.xml");
    string id = "7-111-19149-1";
    var elements = from ele in xe.Elements()
                    where (string)ele.Attribute("ISBN") == id
                    select ele;
    if (elements.Count() > 0)
    {
        XElement first = elements.First();
        ///设置新的属性
        first.SetAttributeValue("Type", "11212");
        ///替换新的节点
        first.ReplaceNodes(
                    new XElement("title", "3435"),
                    new XElement("author", "55656"),
                    new XElement("price", "9999")
                    );
    }
    xe.Save(@"d:/demoLinq.xml");
    
    #endregion 修改某一记录
    

    删除##

    #region 删除选中的数据
    
    XElement xe = XElement.Load(@"d:/demoLinq.xml");
    string id = "";
    var elements = from ele in xe.Elements("book")
                    where (string)ele.Attribute("ISBN") == id
                    select ele;
    if (elements.Count() > 0)
    {
        elements.First().Remove();
    }
    xe.Save(@"d:/demoLinq.xml");
    
    #endregion 删除选中的数据
    
    #region 修改某一记录
    
  • 相关阅读:
    MySQL优化
    数据库之事务
    浮动与定位的区别
    CSS-画三角
    CSS(中)篇
    CSS(前)篇
    html篇
    定位真机运行能用但是打包成apk就不能用的解决方法
    定位与权限
    activity与fragment之间的传递数据
  • 原文地址:https://www.cnblogs.com/wxc-kingsley/p/Xml-003.html
Copyright © 2020-2023  润新知