好的,阿杰 👍
我来给你系统整理一下 C# 操作 XML 的方法详解,涵盖常用类、读写方式、增删改查、以及一些技巧。


📝 C# 操作 XML 方法详解

在 C# 中,常见的 XML 操作主要有三大类:

  1. XmlDocument(DOM 方式) → 类似树结构,适合频繁修改
  2. XmlReader / XmlWriter(流方式) → 只读或顺序写,性能高
  3. LINQ to XML(XDocument / XElement) → 现代写法,代码简洁

1. 使用 XmlDocument(DOM 操作)

读取 XML

XmlDocument doc = new XmlDocument();
doc.Load("books.xml"); // 加载 XML 文件

// 获取根节点
XmlElement root = doc.DocumentElement;
Console.WriteLine("根节点:" + root.Name);

// 遍历子节点
foreach (XmlNode node in root.ChildNodes)
{
    Console.WriteLine(node.Name + " : " + node.InnerText);
}

查找节点

XmlNode book = doc.SelectSingleNode("/bookstore/book[@id='1']");
Console.WriteLine(book["title"].InnerText);

添加节点

XmlElement newBook = doc.CreateElement("book");
newBook.SetAttribute("id", "3");

XmlElement title = doc.CreateElement("title");
title.InnerText = "C#入门";
newBook.AppendChild(title);

doc.DocumentElement.AppendChild(newBook);
doc.Save("books.xml");

修改节点

XmlNode node = doc.SelectSingleNode("/bookstore/book[@id='1']/title");
node.InnerText = "C# 高级编程";
doc.Save("books.xml");

删除节点

XmlNode node = doc.SelectSingleNode("/bookstore/book[@id='2']");
node.ParentNode.RemoveChild(node);
doc.Save("books.xml");


2. 使用 XmlReader / XmlWriter(流方式)

XmlReader(只读,向前读取)

using (XmlReader reader = XmlReader.Create("books.xml"))
{
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element && reader.Name == "title")
        {
            Console.WriteLine("书名: " + reader.ReadElementContentAsString());
        }
    }
}

XmlWriter(写入 XML)

using (XmlWriter writer = XmlWriter.Create("books.xml"))
{
    writer.WriteStartDocument();
    writer.WriteStartElement("bookstore");

    writer.WriteStartElement("book");
    writer.WriteAttributeString("id", "1");
    writer.WriteElementString("title", "C#入门");
    writer.WriteElementString("author", "阿杰");
    writer.WriteEndElement(); // book

    writer.WriteEndElement(); // bookstore
    writer.WriteEndDocument();
}


3. 使用 LINQ to XML(推荐方式)

命名空间:

using System.Xml.Linq;

读取 XML

XDocument doc = XDocument.Load("books.xml");

// 遍历所有书籍
foreach (XElement book in doc.Descendants("book"))
{
    Console.WriteLine(book.Element("title").Value);
}

查询节点

var titles = from b in doc.Descendants("book")
             where (string)b.Attribute("id") == "1"
             select b.Element("title").Value;

foreach (var title in titles)
    Console.WriteLine(title);

添加节点

doc.Root.Add(
    new XElement("book",
        new XAttribute("id", "3"),
        new XElement("title", "LINQ to XML"),
        new XElement("author", "阿杰")
    )
);
doc.Save("books.xml");

修改节点

var book = doc.Descendants("book")
              .FirstOrDefault(b => (string)b.Attribute("id") == "1");
if (book != null)
{
    book.Element("title").Value = "C# 精通指南";
    doc.Save("books.xml");
}

删除节点

doc.Descendants("book")
   .Where(b => (string)b.Attribute("id") == "2")
   .Remove();
doc.Save("books.xml");


4. 选择哪种方式?

  • XmlDocument:适合老项目,操作直观,但代码冗长。
  • XmlReader/Writer:适合大文件读取,流式处理,效率高。
  • LINQ to XML:推荐,代码简洁、功能强大,和 LINQ 查询结合。