範例 XML 檔案 (bookstore.xml)
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberons Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
</bookstore>
1. 新增 <book> 節點至 <bookstore>
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode root = xmlDoc.SelectSingleNode("bookstore"); // 找到根節點
// 建立 book 元素與屬性
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");
結果
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">...</book>
<book genre="李贊紅" ISBN="2-3631-4">
<title>CS從入門到精通</title>
<author>候捷</author>
<price>58.3</price>
</book>
</bookstore>
2. 修改節點:genre="李贊紅" 的 book
- 將 genre 改為 "update李贊紅"
- 將子節點 <author> 文字改為 "亞勝"
XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("genre") == "李贊紅")
{
// 修改屬性
xe.SetAttribute("genre", "update李贊紅");
// 遍歷子節點找 author
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");
關鍵 API 對照
| 操作 | 方法/屬性 |
| 載入 XML | XmlDocument.Load(path) |
| 查詢單一節點 | SelectSingleNode(xpath) |
| 查詢多個節點 | SelectNodes(xpath) 或 ChildNodes |
| 建立元素 | CreateElement(name) |
| 設定屬性 | SetAttribute(name, value) |
| 設定文字內容 | InnerText |
| 新增子節點 | AppendChild(node) |
| 儲存 | Save(path) |
進階建議
- 使用 XPath 語法精確定位:
//book[@genre='李贊紅']
- 大量操作考慮
XmlWriter 流式寫入效能更好
- Schema 驗證可用
XmlReaderSettings.Schemas
- LINQ to XML (
System.Xml.Linq) 提供更現代化 API