测试开始先读取XML源,用一个比较大的rss文件链接,复制到项目bin/debug目录下。
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
二、XPathNavigator 方式
代码
1 static IList testXmlNavigator() 2 { 3 var doc = new Xmldocument(); 4 doc.Load(xmlStream); 5 var nav = doc.CreateNavigator(); 6 nav.MoveToRoot(); 7 var nodeList = nav.Select("/channel/item"); 8 var lstChannel = new List
三、XmlTextReader 方式
代码
1 static ListtestXmlReader() 2 { 3 var lstChannel = new List (); 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() 2 { 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").Value14 };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了。
以上就是XML数据读取方式性能比较(一)的内容,更多相关内容请关注PHP中文网(www.kaotop.com)!



