在 C# (.NET) 中处理 XML:完整指南
XML(可扩展标记语言)仍然是 .NET 生态系统中存储和传输结构化数据的关键格式之一。在 C# 中,有多种强大的工具可用于处理 XML:从经典的 XmlDocument 到来自 LINQ to XML 的现代 XDocument,以及通过 XmlSerializer 进行的高级序列化。在本文中,我们将通过实际示例介绍所有主要方法。
1. 经典方法:XmlDocument
System.Xml.XmlDocument 是一种 DOM(文档对象模型)模型,它将整个 XML 文档作为节点树加载到内存中。自 .NET Framework 1.0 时代以来,开发人员就熟悉这种方法。
加载和读取 XML
using System.Xml;
XmlDocument doc = new XmlDocument();doc.Load("books.xml");
// 获取根元素XmlElement root = doc.DocumentElement;
// 遍历所有子节点foreach (XmlNode node in root.ChildNodes){ if (node.Name == "book") { string title = node["title"]?.InnerText; string author = node["author"]?.InnerText; Console.WriteLine($"书籍:{title},作者:{author}"); }}创建和写入 XML
XmlDocument newDoc = new XmlDocument();XmlElement rootElem = newDoc.CreateElement("library");newDoc.AppendChild(rootElem);
XmlElement book = newDoc.CreateElement("book");rootElem.AppendChild(book);
XmlElement title = newDoc.CreateElement("title");title.InnerText = "大师与玛格丽特";book.AppendChild(title);
newDoc.Save("library.xml");优点:简单,支持 XPath,完全控制 DOM。
缺点:占用大量内存,不支持 LINQ。
2. 现代方法:LINQ to XML (XDocument)
从 .NET 3.5 开始,建议使用 System.Xml.Linq 命名空间。XDocument、XElement 和 XAttribute 类提供了更轻量级、功能更丰富的 API,并与 LINQ 完全集成。
使用 XDocument 读取 XML
using System.Xml.Linq;
XDocument xdoc = XDocument.Load("books.xml");
var books = xdoc.Descendants("book") .Select(b => new { Title = b.Element("title")?.Value, Author = b.Element("author")?.Value, Year = (int?)b.Element("year") });
foreach (var book in books){ Console.WriteLine($"{book.Title} — {book.Author} ({book.Year})");}使用 XElement 创建 XML
XDocument xdoc = new XDocument( new XElement("library", new XElement("book", new XElement("title", "罪与罚"), new XElement("author", "费奥多尔·陀思妥耶夫斯基"), new XAttribute("id", "1") ) ));
xdoc.Save("library2.xml");优点:语法简洁,支持 LINQ,内存占用更少。
缺点:对于习惯 DOM 的开发人员来说可能不太习惯。
3. 对象序列化为 XML:XmlSerializer
如果您有 C# 类,可以使用 System.Xml.Serialization.XmlSerializer 自动将它们转换为 XML 并转换回来。
用于序列化的示例类
[Serializable]public class Book{ [XmlAttribute("id")] public int Id { get; set; }
[XmlElement("title")] public string Title { get; set; }
[XmlElement("author")] public string Author { get; set; }
[XmlIgnore] public string InternalNote { get; set; }}序列化(对象 → XML)
using System.Xml.Serialization;using System.IO;
Book book = new Book { Id = 1, Title = "战争与和平", Author = "列夫·托尔斯泰" };
XmlSeria