在C#编程中,XML是一种常见的数据存储和交换格式,用于结构化数据的处理。本文将深入探讨如何使用C#对XML文件进行增删改查操作。我们来看一个简单的XML文件示例,名为`bookstore.xml`:
```xml
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
</bookstore>
```
1. **增加节点**
在这个例子中,我们需要在`<bookstore>`节点下插入一个新的`<book>`节点。我们创建一个`XmlDocument`对象加载XML文件,然后通过`SelectSingleNode`方法找到`<bookstore>`节点。接着,我们使用`CreateElement`方法创建新的`<book>`节点,并设置其属性。之后,创建并添加子节点如`<title>`、`<author>`和`<price>`,最后将新创建的`<book>`节点添加到`<bookstore>`节点下,并保存更改。
示例代码:
```csharp
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode root = xmlDoc.SelectSingleNode("bookstore");
XmlElement xe1 = xmlDoc.CreateElement("book");
xe1.SetAttribute("genre", "李赞红");
xe1.SetAttribute("ISBN", "2-3631-4");
XmlElement xesub1 = xmlDoc.CreateElement("title");
xesub1.InnerText = "CS从入门到精通";
xe1.AppendChild(xesub1);
XmlElement xesub2 = xmlDoc.CreateElement("author");
xesub2.InnerText = "候捷";
xe1.AppendChild(xesub2);
XmlElement xesub3 = xmlDoc.CreateElement("price");
xesub3.InnerText = "58.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);
xmlDoc.Save("bookstore.xml");
```
2. **修改节点**
要修改XML中的节点,我们可以遍历XML文档,找到目标节点并更新其属性或内容。在这个例子中,我们要修改genre属性为"李赞红"的`<book>`节点,将其genre属性更改为"update李赞红",并将该节点下的`<author>`子节点文本修改为"亚胜"。
示例代码:
```csharp
XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("genre") == "李赞红")
{
xe.SetAttribute("genre", "update李赞红");
XmlNodeList nls = xe.ChildNodes;
foreach (XmlNode xn1 in nls)
{
XmlElement xe2 = (XmlElement)xn1;
if (xe2.Name == "author")
{
xe2.InnerText = "亚胜";
break;
}
}
break;
}
}
xmlDoc.Save("bookstore.xml");
```
3. **删除节点**
删除节点通常涉及找到要删除的节点,然后使用`RemoveChild`方法将其从父节点中移除。例如,如果我们想删除genre为"update李赞红"的`<book>`节点,可以这样做:
```csharp
XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("genre") == "update李赞红")
{
root.RemoveChild(xe);
break;
}
}
xmlDoc.Save("bookstore.xml");
```
4. **查询节点**
查询XML文档中的特定节点通常使用XPath表达式。例如,要获取所有genre为"fantasy"的`<book>`节点,可以这样做:
```csharp
XmlNodeList nodeList = xmlDoc.SelectNodes("//book[@genre='fantasy']");
foreach (XmlNode xn in nodeList)
{
Console.WriteLine("Genre: {0}, Title: {1}", xn.Attributes["genre"].Value, ((XmlElement)xn).SelectSingleNode("title").InnerText);
}
```
总结,C#提供了丰富的API来处理XML文件,包括`XmlDocument`类用于加载和保存XML,`XmlNode`和`XmlElement`类用于表示和操作XML节点。通过这些工具,开发者可以轻松地对XML数据进行增删改查操作,满足各种业务需求。在实际应用中,确保正确处理异常和错误,以及考虑性能优化,例如批量操作和缓存等策略。