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 修改某一记录
原文地址:https://www.cnblogs.com/wxc-kingsley/p/Xml-003.html