在c# 开发过程中,xml文件和json是一种常用的文件格式。我们在写WinForm程序的时候,其中包含的app.config文件或Web网站应用中web.config文件都是属于xml文件结构。不仅如此还有许多重要的场景都有它的身影,在我们在日常开发时微软官方也提供了丰富的xml类库来方便我们操作xml文件,例如XmlDocument、XmlTextReader、Linq to Xml等方式,下面就来介绍一下在c#中如何读写xml文件。本文示例代码下载 XmlTestPro.zip(密码:7831)
XmlDocument操作XML
使用XmlDocument是一种基于文档结构的方式来读取XML文件,在XML文件中,我们可以把XML看作是由文档声明(Declare)、元素(Element)、属性(Attribute)、文本(Text)等构成的一个树。最开始的一个结点叫作根结点,每个结点都可以有自己的子结点,子节点可以有多个。得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性,下面我们来介绍一下使用XmlDocument、XmlElement读取编辑删除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();
}
}
从上面可以看到,我们修改了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)