幾個月來,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了。現在已經知道,至少有四種常用人XML資料操作方式(好像Java差不多),不過還沒有實際比較過這些方式各有哪些特點或優劣。正好看到網上也沒有這方面的實驗,偶來總結一下。
Stream xmlStream =new MemoryStream(File.ReadAllBytes(path));
一、XmlDocument 方式
代碼
1 static IList testXmlDocument()
2 {
3 var doc =new XmlDocument();
4 doc.Load(xmlStream);
5 var nodeList = doc.DocumentElement.ChildNodes;
6 var lstChannel =new List<Object>(nodeList.Count );
7 foreach (XmlNode node in nodeList)
8 {
9 var channel =new
10 {
11 Title = node.SelectSingleNode("title").InnerText,
12 Link = node.SelectSingleNode("link").InnerText,
13 Description = node.SelectSingleNode("description").InnerText,
14 Content = node.SelectSingleNode("content").InnerText,
15 PubDate = node.SelectSingleNode("pubDate").InnerText,
16 Author = node.SelectSingleNode("author").InnerText,
17 Category = node.SelectSingleNode("category").InnerText
18 };
19 lstChannel.Add(channel);
20 }
21 return lstChannel;
22 }
二、XPathNavigator 方式
1 static IList testXmlNavigator()
5 var nav = doc.CreateNavigator();
6 nav.MoveToRoot();
7 var nodeList = nav.Select("/channel/item");
8 var lstChannel =new List<Object>(nodeList.Count);
9 foreach (XPathNavigator node in nodeList)
10 {
11 var channel =new
12 {
13 Title = node.SelectSingleNode("title").Value,
14 Link = node.SelectSingleNode("link").Value,
15 Description = node.SelectSingleNode("description").Value,
16 Content = node.SelectSingleNode("content").Value,
17 PubDate = node.SelectSingleNode("pubDate").Value,
18 Author = node.SelectSingleNode("author").Value,
19 Category = node.SelectSingleNode("category").Value
20 };
21 lstChannel.Add(channel);
22 }
23 return lstChannel;
24 }
三、XmlTextReader 方式
1 static List<Channel> testXmlReader()
3 var lstChannel =new List<Channel>();
4 var reader = XmlReader.Create(xmlStream);
5 while (reader.Read())
6 {
7 if (reader.Name =="item"&& reader.NodeType == XmlNodeType.Element)
8 {
9 var channel =new Channel();
10 lstChannel.Add(channel);
11 while (reader.Read())
12 {
13 if (reader.Name =="item") break;
14 if (reader.NodeType != XmlNodeType.Element) continue;
15 switch (reader.Name)
16 {
17 case"title":
18 channel.Title = reader.ReadString();
19 break;
20 case"link":
21 channel.Link = reader.ReadString();
22 break;
23 case"description":
24 channel.Description = reader.ReadString();
25 break;
26 case"content":
27 channel.Content = reader.ReadString();
28 break;
29 case"pubDate":
30 channel.PubDate = reader.ReadString();
31 break;
32 case"author":
33 channel.Author = reader.ReadString();
34 break;
35 case"category":
36 channel.Category = reader.ReadString();
37 break;
38 default:
39 break;
40 }
41 }
42 }
43 }
44 return lstChannel;
45 }
四、Linq to XML 方式
1 static IList testXmlLinq()
3 var xd = XDocument.Load(xmlStream);
4 var list = from node in xd.Elements("channel").Descendants("item")
5 select new
6 {
7 Title = node.Element("title").Value,
8 Link = node.Element("link").Value,
9 Description = node.Element("description").Value,
10 Content = node.Element("content").Value,
11 PubDate = node.Element("pubDate").Value,
12 Author = node.Element("author").Value,
13 Category = node.Element("category").Value
14 };
15 return list.ToList();
16 }
測試結果:
XmlDocment
47ms
XPathNavigator
42ms
XmlTextReader
23ms
Xml Linq
28ms
小結一下自己的認識,XmlDocument的操作基本按W3C的DOM操作方式,不過要将全部節點解析成對象加載到記憶體中,往往造成很大浪費。是以微軟自己的程式設計規範也不推薦用它。這裡由于讀取了所有節點,可能是以性能和Navigator方式相差不大。在三種随機讀取方式中,Xml Linq性能最高,隻是方法名有點别扭。XmlTextReader方式是所謂的SAX,隻讀向前,無疑性能最高,不過實作上麻煩了不少,要比較精确的控制通路邏輯,也無法用匿名類存儲資料。
.Net 3.5釋出Xml Linq可以很好地取代前兩種方式,通常情況下,最好用它。隻有個别場合,如果對性能要求極高,或者讀取Xml資料量太大不能一下子下載下傳或讀取到記憶體中,那就隻好痛苦委身于XmlTextReader了。