XML数据读取方式性能比较(一)

互联网 17-2-13
  几个月来,疑被SOA,一直在和xml操作打交道,SQL差不多又忘光了。现在已经知道,至少有四种常用人XML数据操作方式(好像java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣。正好看到网上也没有这方面的实验,偶来总结一下。

  测试开始先读取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<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()   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<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()   2 {   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()   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").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了。

以上就是XML数据读取方式性能比较(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:vbs类天生xml文件

相关资讯