LinqToXml簡介1:建立並儲存XML
早在.NET Framework 1.1時代就大量的利用XmlDocument類別來處理XML相關的事務,每天在那邊Node來Entity去的,雖然說很煩但實在也慢慢的習慣了,後來JSON興盛起來後慢慢就沒有再涉獵XML較晚期的技術。LINQ to XML其實是在.NET Framework 3.5時期發表,被放置在System.Xml.Linq.dll類別裡面,利用LINQ to XML技術,我們可以擺脫早期使用XmlDocument要組成一個複雜的XML文件,必須宣告一堆複雜的XML類別實例之問題。取而代之的是利用串接的Lambda表達式來快速創建XML文件。
這陣子剛好要處理XML相關需求,因此就來練習一下。
利用LINQ to XML快速創建XML文件
他的方便性跟以前簡直不可同日而語,詳細過程直接看程式碼,有經驗的程式設計師應該會馬上意會過來怎麼使用。
System.Xml.Linq.XDocument oXml = new System.Xml.Linq.XDocument(
new System.Xml.Linq.XDeclaration("1.0", "UTF-8", "yes"),
new System.Xml.Linq.XElement("Employees",
new System.Xml.Linq.XElement("Person",
new System.Xml.Linq.XAttribute("ID", "A1234"),
new System.Xml.Linq.XElement("Name", "王小明"),
new System.Xml.Linq.XElement("Address", "台北市OOO路")
),
new System.Xml.Linq.XElement("Person",
new System.Xml.Linq.XAttribute("ID", "A5678"),
new System.Xml.Linq.XElement("Name", "李小華"),
new System.Xml.Linq.XElement("Address", "高雄市OOO路")
)
)
);
P.S 若是要從外部讀取XML,跟以前一樣使用LOAD()方法即可。
從上面的程式碼我們可以得知,主要就是建立XDocument,另外給一個XDeclaration型塑出Well-Formed XML。此外就是最重要的重點XElement與XAttribute,基本上XML主要的描述就是由這兩個類別元素構成。
為何需要外面要包一個XDocument?
若你沒有輸出XML的必要性,其實可以不要包一個XDocument,因為XElement等級的元素也可以直接ToString()將XML輸出。而包入XDocument根類別很簡單,因為XDocument有一個SAVE()方法,可以把你的XML進行minify壓縮輸出(縮減容量)。
oXml.Save(@"D:\test.xml", System.Xml.Linq.SaveOptions.DisableFormatting);
壓縮前(SaveOptions.None):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Employees>
<Person ID="A1234">
<Name>王小明</Name>
<Address>台北市OOO路</Address>
</Person>
<Person ID="A5678">
<Name>李小華</Name>
<Address>高雄市OOO路</Address>
</Person>
</Employees>
壓縮後(SaveOptions.DisableFormatting):
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Employees><Person ID="A1234"><Name>王小明</Name><Address>台北市OOO路</Address></Person><Person ID="A5678"><Name>李小華</Name><Address>高雄市OOO路</Address></Person></Employees>
簡單的LINQ查詢XML範例
基本上要使用LINQ查詢,就要引入System.Linq才可以使用,有了IEumerable
//返回IEumerable<System.Xml.Linq.XElement>集合
var oSubXML = oXml.Root.Elements("Person");
//找Person裡面的ID屬性開頭是A123的集合
var oSubXml = oXml.Root.Elements("Person").Where(x => x.Attribute("ID").Value.StartsWith("A123"));
//找Person裡面的Address元素內容包含高雄市的集合
var oSubXml = oXml.Root.Elements("Person").Where(x => x.Element("Address").Value.Contains("高雄市"));
以最後這個搜尋地址的範例來說,所找出來的XElement集合只有一筆,且其挑選到的結果內容為:
<Person ID="A5678">
<Name>李小華</Name>
<Address>高雄市OOO路</Address>
</Person>