好的,阿杰,我们来系统梳理一下 C# 操作 XML 文件的基础方法,重点讲 XmlDocumentXmlElementXmlNode 的使用。我们一步步讲,并附带示例。


1. XmlDocument

XmlDocument 是 C# 中操作 XML 的核心类,相当于 内存中的 XML DOM

常用操作

  1. 加载 XML
XmlDocument doc = new XmlDocument();
doc.Load("books.xml"); // 从文件加载
// doc.LoadXml("<books>...</books>"); // 从字符串加载

  1. 保存 XML
doc.Save("books_new.xml");

  1. 获取根节点
XmlNode root = doc.DocumentElement;
Console.WriteLine(root.Name); // 输出根节点名称


2. XmlNode

XmlNode 是 XML 中的 节点抽象,可以是元素、属性、文本等。常用方法:

  • 选择节点
XmlNode node = doc.SelectSingleNode("/books/book[1]");

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

  • 获取或修改值
XmlNode firstBook = root.FirstChild;
Console.WriteLine(firstBook.InnerText);
firstBook.InnerText = "新的内容";


3. XmlElement

XmlElement 是 元素节点,继承自 XmlNode。可以操作元素本身和属性。

常用操作

  1. 创建新元素
XmlElement newBook = doc.CreateElement("book");
newBook.InnerText = "C# 入门教程";

  1. 添加属性
newBook.SetAttribute("id", "001");

  1. 添加到 XML 中
root.AppendChild(newBook);

  1. 获取属性
string id = newBook.GetAttribute("id");
Console.WriteLine(id); // 输出 001


4. 常用组合操作示例

假设 XML 文件 books.xml

<books>
  <book id="001">C# 入门</book>
  <book id="002">Java 基础</book>
</books>

添加新节点

XmlDocument doc = new XmlDocument();
doc.Load("books.xml");

XmlElement newBook = doc.CreateElement("book");
newBook.SetAttribute("id", "003");
newBook.InnerText = "Python 数据分析";

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

修改节点内容

XmlNode bookNode = doc.SelectSingleNode("/books/book[@id='001']");
if(bookNode != null)
{
    bookNode.InnerText = "C# 高级教程";
}
doc.Save("books.xml");

删除节点

XmlNode bookNode = doc.SelectSingleNode("/books/book[@id='002']");
if(bookNode != null)
{
    doc.DocumentElement.RemoveChild(bookNode);
}
doc.Save("books.xml");


5. 小技巧

  1. XPath 查询SelectSingleNode 或 SelectNodes 可以快速定位节点
  2. 遍历节点ChildNodesParentNodeNextSibling 等
  3. 元素 vs 节点XmlElement 专注于元素,XmlNode 更通用(文本、注释、属性)

💡 总结关系:

XmlDocument  -> 整个 XML 文档
   └─ XmlNode -> XML 中的节点(元素、文本、属性等)
        └─ XmlElement -> 元素节点(XmlNode 子类)