接續上篇的基本操作,這篇主要使用 LINQ to XML 來修改 XML 資料。

目錄:

系列文完整範例程式碼請參考 poychang/Demo-Linq-To-Xml

LINQ to XML 已經幫我們內建了新增、 修改、刪除所需要的方法,我們只要簡單的調用他們,就可以輕鬆完成修改 XML 資料的的目的。

新增 XML 資料

使用 Add() 可以在既有的 XML 資料中新增一筆元素資料,這筆資料會被加在 XML 資料中的最後面,另外也可使用 AddFirst() 將資料加在最前面,請見以下範例:

xmlDocument.Element("Students")?.Add(
    new XElement("Student", new XAttribute("Id", 105),
        new XElement("Name", "Todd"),
        new XElement("Gender", "Male"),
        new XElement("TotalMarks", 980)
    ));
// OUTPUT:
// ------------------------------
// <Students>
//     <Student Id="105">
//         <Name>Todd</Name>
//         <Gender>Male</Gender>
//         <TotalMarks>980</TotalMarks>
//     </Student>
// </Students>

如果想要將資料加在指定元素的前面或後面,可以使用 AddBeforeSelf()AddAfterSelf() 將要新增的資料加在指定的序列位置,請見以下範例:

xmlDocument.Element("Students")?.Elements("Student")
    .First(x => x.Attribute("Id")?.Value == "103")
    .AddBeforeSelf(
        new XElement("Student", new XAttribute("Id", 106),
            new XElement("Name", "Todd"),
            new XElement("Gender", "Male"),
            new XElement("TotalMarks", 980)));
// OUTPUT:
// ------------------------------
// <Students>
//     <Student Id="106">
//         <Name>Todd</Name>
//         <Gender>Male</Gender>
//         <TotalMarks>980</TotalMarks>
//     </Student>
//     <Student Id="103">
//         <Name>Pam</Name>
//         <Gender>Female</Gender>
//         <TotalMarks>850</TotalMarks>
//     </Student>
// </Students>

修改 XML 資料

更新 XML 既有元素可先透過 LINQ 找到目標元素後,使用 SetElementValue() 或是 SetValue() 方法,修改該元素的值,請見以下範例:

xmlDocument.Element("Students")?.Elements("Student")
    .FirstOrDefault(x => x.Attribute("Id")?.Value == "106")?.SetElementValue("TotalMarks", 999);
xmlDocument.Element("Students")?.Elements("Student")
	.Where(x => x.Attribute("Id")?.Value == "106")
    .Select(x => x.Element("TotalMarks")).FirstOrDefault()?.SetValue(999);

上面兩段程式碼會是等價的,但查詢方式不同,所以調用不同的修改方法,第一種方式會先找到 Student 這個元素後,修改底下的指定的屬性值,第二種則是找到 Student 這個元素後,針對 TotalMarks 這個屬性去修改設定值。

刪除 XML 資料

刪除的動作相當簡單,請見以下範例:

// 刪除篩選到的 XML 元素
xmlDocument.Root?.Elements().Where(x => x.Attribute("Id")?.Value == "106").Remove();

// 刪除根元素底下的所有 XML 元素,以範例來說,為刪除根元素下 Students 元素
xmlDocument.Root?.Elements().Remove();

這裡的 xmlDocument.Root 等價於 xmlDocument.Element("Students"),也就是整份 XML 文件的根結點。若是要表示 XML 文件的起始,建議使用 xmlDocument.Root 來操作會比較符合語意且直覺。

請參考 04-ModifyXmlDocument 專案的 Program.cs


參考資料:


Poy Chang

Trial and Error