C# XML 读写实战:XmlDocument 与 XDocument 用法详解

Miles
Miles
发布时间:2026-10-16 | 4人浏览过
原创

在 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# 数据交互与配置文件处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表