C# XML 读写实战:XmlDocument 与 XDocument 用法详解
在 C# 开发中,XML 常用于配置文件存储和数据交换。本文对比讲解传统的 XmlDocument API 与现代 LINQ to XML 中的 XDocument 类,提供从内存构建到文件保存、再到读取解析的完整代码示例。
XML 基础知识与语法规范
XML(可扩展标记语言)是一种纯文本格式,具有跨平台兼容性强、结构清晰的特点。它与 HTML 的主要区别在于:HTML 专注于数据的显示且标签固定,而 XML 专注于数据的存储和处理,标签由用户自定义且可扩展。
在使用 C# 操作 XML 前,需掌握以下语法规则:
- 区分大小写:标签名和属性名严格区分大小写。
- 单一根节点:文档必须包含且仅包含一个顶层元素。
- 标签闭合:所有标签必须成对出现(如
<item></item>),自闭合标签需写成<br />。 - 属性引号:属性值必须使用双引号包裹。
- 文档声明:推荐以
<?xml version="1.0" encoding="utf-8"?>开头。
准备条件:命名空间引入
C# 处理 XML 主要依赖 System.Xml 系列命名空间。旧版使用 System.Xml,新版推荐使用 System.Xml.Linq。确保项目中已引用相关 DLL。
第一种方法:使用 XmlDocument 操作 XML
XmlDocument 是 .NET Framework 早期提供的基于 DOM 的解析器,遵循 W3C DOM 标准,兼容性极好,但 API 较为繁琐。
第 1 步:构建 DOM 对象并添加声明
目的:初始化内存中的 XML 树结构,并添加标准的头部声明。
static void Main(string[] args)
{
// 1. 在内存中构建 Dom 对象
XmlDocument xmlDoc = new XmlDocument();
// 增加文档说明:版本号、编码格式、standalone属性
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "yes");
xmlDoc.AppendChild(xmlDeclaration);
}第 2 步:创建根元素与子元素层级
目的:建立符合规范的嵌套结构。XML 要求必须有根节点,后续元素需逐级追加。
// 增加根元素:创建 <school> XmlElement rootElement = xmlDoc.CreateElement("school");
xmlDoc.AppendChild(rootElement);第 3 步:添加带有属性的子节点
目的:演示如何为元素添加键值对属性,并将子节点附加到父节点下。
// 创建子元素 <class id='x01'>
XmlElement xmlClassElement = xmlDoc.CreateElement("class");
// 创建并设置属性
XmlAttribute attr = xmlDoc.CreateAttribute("id");
attr.Value = "x01";
xmlClassElement.Attributes.Append(attr);
// 将 class 追加到 school 下
rootElement.AppendChild(xmlClassElement);第 4 步:添加文本内容与深层嵌套
目的:展示如何插入实际数据文本,以及更深层级的节点关系。
// 创建 student 节点并添加属性 sid='s011'
XmlElement xmlStudentElement = xmlDoc.CreateElement("student");
XmlAttribute studentAttr = xmlDoc.CreateAttribute("sid");
studentAttr.Value = "s011";
xmlStudentElement.Attributes.Append(studentAttr);
xmlClassElement.AppendChild(xmlStudentElement);
// 添加 name 子节点并设置文本内容
XmlElement xmlNameElement = xmlDoc.CreateElement("name");
xmlNameElement.InnerText = "天";
xmlStudentElement.AppendChild(xmlNameElement);
// 将该 Dom 对象写入 xml 文件
xmlDoc.Save("school.xml");
Console.WriteLine("写入成功");
}注意:以上步骤可根据实际需求使用循环结构批量生成节点,以提高效率。
第二种方法:使用 XDocument 操作 XML
XDocument 属于 LINQ to XML 技术栈,API 更简洁,支持链式调用,是现代 C# 开发的首选方式。它位于 System.Xml.Linq 命名空间中。
第 1 步:初始化 XDocument 与声明
目的:创建文档实例并设定元数据头。
// 1. 创建 Dom 对象
XDocument xDoc = new XDocument();
XDeclaration xDec = new XDeclaration("1.0", "utf-8", null);
xDoc.Declaration = xDec;第 2 步:构建根节点与数据模型
目的:定义容器结构,并为后续数据填充做准备。这里演示从 List 集合中读取数据写入 XML。
// 准备数据源
List<Person> list = new List<Person>();
list.Add(new Person() { Name = "Sam", Age = 18 });
list.Add(new Person() { Name = "Penny", Age = 20 });
// 2. 创建根节点
XElement rootElement = new XElement("List");
xDoc.Add(rootElement);第 3 步:循环生成节点并保存
目的:遍历数据列表,动态创建对应的 XML 元素,设置属性和文本值,最后持久化到磁盘。
// 3. 循环创建节点
for (int i = 0; i < list.Count; i++)
{
XElement personElement = new XElement("Person");
// 设置属性:id 从 1 开始编号
personElement.SetAttributeValue("id", (i + 1).ToString());
// 设置子元素文本值
personElement.SetElementValue("Name", list[i].Name);
personElement.SetElementValue("Age", list[i].Age);
// 添加到根节点下
rootElement.Add(personElement);
}
// 保存文件
xDoc.Save("List.xml");
Console.WriteLine("ok");
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}第三种场景:读取与解析现有 XML 文件
当 XML 文件已存在时,可使用 XDocument.Load() 加载到内存,并通过 LINQ 或元素访问方法提取数据。
第 1 步:加载文档并定位根节点
目的:将磁盘上的 XML 文件读入内存树结构。
static void Main(string[] args)
{
// 读取 XML 文件
XDocument document = XDocument.Load("List.xml");
XElement rootElement = document.Root;
// 示例:直接获取特定子元素的值
// 注意:此处假设 XML 结构中有 CustomerName 节点
if (rootElement.Element("CustomerName") != null)
{
Console.WriteLine("订购人:{0}", rootElement.Element("CustomerName").Value);
}
// 遍历子节点
if (rootElement.Element("Items") != null)
{
foreach (var item in rootElement.Element("Items").Elements("OrderItem"))
{
// 获取属性值
var name = item.Attribute("Name");
if (name != null)
Console.WriteLine("商品名称:{0}", name.Value);
}
}
}上述代码展示了如何安全地访问可能不存在的节点(建议在实际项目中加入判空逻辑以避免 NullReferenceException)。
总结
本文详细介绍了 C# 中处理 XML 的两种主流方式。XmlDocument 适合需要严格遵循传统 DOM 标准的场景,而 XDocument 凭借更简洁的 API 和 LINQ 支持,在处理复杂数据结构和进行查询筛选时更具优势。开发者可根据项目版本和维护习惯选择合适的工具。以上就是 C# 中 XML 基础用法的详细内容,更多关于 C# 数据交互与配置文件处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









