天天看點

XML資料讀取方式性能比較(一)

  幾個月來,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了。現在已經知道,至少有四種常用人XML資料操作方式(好像Java差不多),不過還沒有實際比較過這些方式各有哪些特點或優劣。正好看到網上也沒有這方面的實驗,偶來總結一下。

Stream xmlStream =new MemoryStream(File.ReadAllBytes(path));

    

  一、XmlDocument 方式

XML資料讀取方式性能比較(一)
XML資料讀取方式性能比較(一)

代碼

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 方式

XML資料讀取方式性能比較(一)
XML資料讀取方式性能比較(一)

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 方式

XML資料讀取方式性能比較(一)
XML資料讀取方式性能比較(一)

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 方式

XML資料讀取方式性能比較(一)
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了。