在 C# (.NET) 中处理 XML:完整指南
XML(可扩展标记语言)仍然是 .NET 生态系统中存储和传输结构化数据的关键格式之一。在 C# 中,提供了多种强大的库和方法来处理 XML,从经典的 XmlDocument 到现代的 LINQ to XML。在本文中,我们将介绍主要工具、它们的特点,并为实际任务提供实用示例。
1. .NET 中处理 XML 的主要库
.NET 平台为开发者提供了多个用于处理 XML 的 API:
- System.Xml (XmlDocument, XmlReader, XmlWriter) — 经典的 DOM(文档对象模型)方法。允许将整个 XML 文档加载到内存中,并将其作为节点树进行处理。
- LINQ to XML (XDocument, XElement, XAttribute) — 现代、更轻量且方便的 API,与 LINQ 集成。推荐用于大多数新项目。
- XmlSerializer — 用于自动将 C# 对象序列化和反序列化为 XML 及反向操作。
- XPath (SelectSingleNode, SelectNodes) — 用于在 XML 文档中导航的查询语言。在
XmlDocument和XDocument(通过扩展)中都受支持。
2. LINQ to XML:现代方法
System.Xml.Linq 库(LINQ to XML)是在 C# 中处理 XML 的首选方案。它提供了清晰的语法、轻量级的加载以及对 LINQ 查询的支持。
创建 XML 文档
using System.Xml.Linq;
XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement("books", new XElement("book", new XAttribute("id", "1"), new XElement("title", "战争与和平"), new XElement("author", "列夫·托尔斯泰"), new XElement("price", 599.99m) ), new XElement("book", new XAttribute("id", "2"), new XElement("title", "罪与罚"), new XElement("author", "费奥多尔·陀思妥耶夫斯基"), new XElement("price", 450.00m) ) ));
doc.Save("books.xml");加载和读取 XML
XDocument loadedDoc = XDocument.Load("books.xml");
// 获取所有书籍var allBooks = loadedDoc.Descendants("book");
foreach (var book in allBooks){ string id = book.Attribute("id")?.Value; string title = book.Element("title")?.Value; string author = book.Element("author")?.Value; Console.WriteLine($"书籍 #{id}: {title} — {author}");}使用 LINQ 进行查询
// 选择价格超过 500 卢布的书籍var expensiveBooks = from book in loadedDoc.Descendants("book") where (decimal)book.Element("price") > 500 select new { Title = (string)book.Element("title"), Price = (decimal)book.Element("price") };
foreach (var b in expensiveBooks){ Console.WriteLine($"{b.Title}: {b.Price} 卢布");}3. 经典的 XmlDocument
如果您在处理遗留代码或需要对 DOM 进行完全控制,请使用 System.Xml 命名空间中的 XmlDocument。
加载和导航
using System.Xml;
XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load("books.xml");
XmlNode root = xmlDoc.DocumentElement;XmlNodeList bookNodes = root.SelectNodes("book");
foreach (XmlNode node in bookNodes){ XmlNode titleNode = node.SelectSingleNode("title"); if (titleNode != null) { Console.WriteLine(titleNode.InnerText); }}添加新节点
XmlNode newBook = xmlDoc.Cre