Pages

2015-09-23

XML+LINQ片段讀取解析

讀取XML資料雖然方法各異,但第一原則還是得考慮效能問題,若是來源XML資料是很龐大,就必須使用XmlReader循序讀入,而非貪圖方便用XML DOM類別(XmlDocument, XDocument)讀入記憶體,例如「台灣3+2郵遞區號XML查詢」的檔案讀取。若是片段的XML字串,則以語法搜尋簡便為原則,以前使用XmlDocument + XPath方式讀取資料,但新式做法用XDocument + LINQ更為簡便。

以下是C#範例程式碼:

void Main()
{
string xmlString = @"



10058
臺北市
中正區
八德路1段



10079
臺北市
中正區
三元街
單全



".Trim(); // XML前面不能有空白

//Elements
try
{
// XML字串若有錯誤,在Parse()會丟出例外
var xDoc = XDocument.Parse(xmlString);

// xDoc.Root =
var items = from x in xDoc.Root.Elements("Zip32")
select new Zip32Item {
// Element(name)可能為null
Zip5 = x.Element("Zip5").Value.Trim()
, City = x.Element("City").Value.Trim()
, Area = x.Element("Area").Value.Trim()
, Road = x.Element("Road").Value.Trim()
, Scope = x.Element("Scope").Value.Trim()
};

// 列出內容
items.Dump();
}
catch (Exception ex)
{
ex.ToString().Dump();
}

}

// XML節點強型別Class宣告
public class Zip32Item
{
public string Zip5 { get; set; }
public string City { get; set; }
public string Area { get; set; }
public string Road { get; set; }
public string Scope { get; set; }
}

讀出XML結果為:


image


以上是將XML片段讀取並變成強型別Class的簡易方式。若能選擇來源格式,使用JSON字串會是更便潔好用的方式,因為它能直接反序列化為物件。

No comments: