c# 开发过程中,xml文件json是一种常用的文件格式。我们在写WinForm程序的时候,其中包含的app.config文件或Web网站应用中web.config文件都是属于xml文件结构。不仅如此还有许多重要的场景都有它的身影,在我们在日常开发时微软官方也提供了丰富的xml类库来方便我们操作xml文件,例如XmlDocumentXmlTextReaderLinq to Xml等方式,下面就来介绍一下在c#中如何读写xml文件。本文示例代码下载 XmlTestPro.zip(密码:7831)

XmlDocument操作XML

使用XmlDocument是一种基于文档结构的方式来读取XML文件,在XML文件中,我们可以把XML看作是由文档声明(Declare)、元素(Element)、属性(Attribute)、文本(Text)等构成的一个树。最开始的一个结点叫作根结点,每个结点都可以有自己的子结点,子节点可以有多个。得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性,下面我们来介绍一下使用XmlDocumentXmlElement读取编辑删除xml文件。

名称说明
XmlElement.Name节点名称
XmlElement.Value节点值
XmlElement.InnerText节点文本
XmlElement.InnerXml节点xml
XmlElement.ChildNodes子节点数组
XmlElement.ParentNode父节点信息
XmlElement.Attributes节点属性

使用XmlDocument的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件;支持从网络地址加载xml文件,本文例子xml文件如下。

<?xml version="1.0" encoding="gb2312"?>
<Users>
    <User CreateTime="2022-09-30">
        <Name>张三</Name>
        <Sex>男 </Sex>
        <Age>40 </Age>
    </User>
    <User CreateTime="2022-09-29">
        <Name>李四</Name>
        <Sex>男</Sex>
        <Age>20</Age>
    </User>
</Users>
internal class Program
  {
      private static void Main(string[] args)
      {
          //----------------读取xml节点---------------------
          var xml_doc = new XmlDocument();
          xml_doc.Load("test.xml"  /*xml文件路径*/);
          foreach (XmlElement item in xml_doc.SelectSingleNode("Users").ChildNodes)
          {
              //获取节点自定义
              Console.WriteLine(item.GetAttribute("CreateTime"));

              //遍历下级节点
              foreach (XmlElement node in item.ChildNodes)
              {
                  Console.WriteLine($"{node.InnerText}");
              }

              Console.WriteLine("\r\n");
          }

          //----------------插入xml节点---------------------
          //对xml文件新增一个节点,首先获取根节点
          XmlElement root_node = (XmlElement)xml_doc.SelectSingleNode("Users");

          //定义需要插入的节点
          //创建姓名节点
          var name_node = xml_doc.CreateElement("Name");
          name_node.InnerText = "王五";
          //创建性别节点
          var sex_node = xml_doc.CreateElement("Sex");
          sex_node.InnerText = "男";
          //创建年龄节点
          var age_node = xml_doc.CreateElement("Age");
          age_node.InnerText = "15";

          //创建外层User节点
          var parent_node = xml_doc.CreateElement("User");
          //将子节点加入到User节点中
          parent_node.AppendChild(name_node);
          parent_node.AppendChild(sex_node);
          parent_node.AppendChild(age_node);
          //设置User节点创建时间属性
          parent_node.SetAttribute("CreateTime", "2022-08-09");

          //最后将User节点加入到根节点中
          root_node.AppendChild(parent_node);

          //----------------修改xml节点---------------------
          XmlElement first_node = (XmlElement)root_node.ChildNodes[0];
          //修改第一个节点自定义属性
          first_node.SetAttribute("CreateTime", "1970-01-01");
          //修改下级节点
          foreach (XmlElement item in first_node.ChildNodes)
          {
              if (item.Name == "Name")
              {
                  item.InnerText = "cisharp.com";
              }
              if (item.Name == "Sex")
              {
                  item.InnerText = "无";
              }
          }
          //----------------删除xml节点---------------------
          //获取第二个节点
          var sec_node = root_node.ChildNodes[1];
          root_node.RemoveChild(sec_node);

          xml_doc.Save("test.xml");
          Console.ReadLine();
      }
  }

XmlDocument 使用教程示例

XmlDocument 编辑xml文件
从上面可以看到,我们修改了xml文件中的第1个元素,删除了xml文件的第2个元素,最后新增了一个元素。结果显而易见,都操作成功了。

XmlTextReader读取XML

使用XmlTextReader读取数据的时候,首先创建一个文档流。然后用Read()方法来不断的向下读取,根据读取结点的类型来进行相应的操作。

internal class Program
{
    private static void Main(string[] args)
    {
        //加载xml文件
        using (XmlTextReader reader = new XmlTextReader(@"test.xml"))
        {
            while (reader.Read())
            {
                //判断是否节点元素
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "User")
                    {
                        Console.WriteLine("\r\n");
                        Console.WriteLine(reader.GetAttribute("CreateTime"));
                    }
                    if (reader.Name == "Name" ||
                        reader.Name == "Sex" ||
                        reader.Name == "Age")
                    {
                        Console.WriteLine(reader.ReadElementContentAsString());
                    }
                }
            }
            Console.ReadLine();
        }
    }
}

Linq to Xml读取XML

Linq是C#中出现的一个新特性,它除了能够操作数据库查询以外,还可以查询数组集合等。使用Linq操作XML文件非常的简单,代码比上面两种方式都要少,而且也比较简单。

使用Linq to Xml之前必须引用using System.Linq;using System.Xml.Linq;

internal class Program
{
    private static void Main(string[] args)
    {
        XElement xe = XElement.Load(@"test.xml");
        var elements = from ele in xe.Elements()
                       select ele;

        foreach (var ele in elements)
        {
            Console.WriteLine(ele.Attribute("CreateTime").Value);
            Console.WriteLine(ele.Element("Name").Value);
            Console.WriteLine(ele.Element("Sex").Value);
            Console.WriteLine(ele.Element("Age").Value);
            Console.WriteLine("\r\n");
        }
        Console.ReadLine();
    }
}

反序列化读取XML

这种方式是最方便快捷的,具体怎么操作可以查看我的另一篇文章 C# XML序列化反序列化教程 - 实用工具_软件教程_.net_c#-有码挺好个人博客 (cisharp.com),然后json文件读取序列化反序列化可以参考我的这篇文章 json序列化库进阶教程 - 实用工具_软件教程_.net_c#-有码挺好个人博客 (cisharp.com)

最后修改:2022 年 10 月 01 日
如果觉得我的文章对你有用,请随意赞赏