接續上篇的基本操作,這篇主要使用 LINQ to XML 來查詢 XML 檔案內的資料。
目錄:
系列文完整範例程式碼請參考 poychang/Demo-Linq-To-Xml。
查詢 XML 資料
要使用 LINQ to XML 來查詢 XML 資料前,先記得一個概念,LINQ 可以對資料集合進行查詢,這個資料集合可以想像成一個 Array 或一串 List,我們只要能建立將這個資料集合,把他當作 LINQ 的資料來源即可。
而 LINQ to XML 裡面有三個作為資料集合的方法:
- Elements()
- Descendants()
- DescendantNodes()
Elements()
Elements()
可以從一個指定節點中,取得底下的所有子元素,作為資料集合。也可以設定想要過濾的元素名稱,只抓符合該名稱的元素,例如:
IEnumerable<string> students = XDocument.Load(filePath)
.Elements("Students")
.Elements("Student");
代表從 XML 文件中找到 Students
節點底下,名稱符合 Student
的元素,一筆筆的讀出來作為資料集合,這個資料集合會是 IEnumerable
,因此接著你就可以透過 LINQ 的方式接續處理資料。
Descendants()
Descendants()
跟 Elements()
很像,從一個指定節點中,取得底下的所有子元素,但這裡的子元素的收集,是會將 XML 做遞迴拆解,一層一層將資料拆解出來,並存成可列舉的資料型態。
這方法所組成的資料集合比較不容易解釋,建議使用下面程式碼,修改 filePath
檔案路徑後,執行看看所產生出的資料會有那些東西,有看到實際產生的資料,會比較有感覺。
foreach (var element in XDocument.Load(filePath).Descendants())
{
Console.WriteLine(element);
Console.WriteLine("----------");
}
Descendant 這個英文單字是後代的意思,泛指從某一來源派生(或傳下)的東西。
Descendants()
同樣的也可以設定想要過濾的元素名稱,例如 XDocument.Load(filePath).Descendants("Student")
。
DescendantNodes()
DescendantNodes()
跟 Descendants()
很像,但限縮資料集合只有節點,而沒有元素。
以這個 XML 作為範例說明:
<Students>
<Student Id="101">
<Name>Mark</Name>
<Gender>Male</Gender>
<TotalMarks>800</TotalMarks>
</Student>
<Student Id="103">
<Name>John</Name>
<Gender>Male</Gender>
<TotalMarks>950</TotalMarks>
</Student>
</Students>
<Student>
是一個 XML 節點也是 XML 元素,而 <Name>
是一個 XML 元素。
因此 DescendantNodes()
會將指定節點底下的所有節點作為資料集合,例如 XDocument.Load(filePath).DescendantNodes()
會收集到兩筆 Student
節點。
請注意 DescendantNodes()
無法設定過濾的名稱(畢竟他的目標是節點,不是元素)。
除了 DescendantNodes(),請參考
03-QueryXmlDocument
專案的 Program.cs
參考資料: