好的,阿杰 👍
我来给你系统整理一下 C# 操作 XML 的方法详解,涵盖常用类、读写方式、增删改查、以及一些技巧。
📝 C# 操作 XML 方法详解
在 C# 中,常见的 XML 操作主要有三大类:
- XmlDocument(DOM 方式) → 类似树结构,适合频繁修改
- XmlReader / XmlWriter(流方式) → 只读或顺序写,性能高
- 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 查询结合。
发表回复