几个月来,疑被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 = new10         {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").InnerText18         };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 = new12         {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").Value20         };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").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.php.cn)!

更多相关文章

  1. XML数据读取方式性能比较(二)
  2. xml解析方式之JAXP解析入门
  3. android dom 解析xml方式
  4. android dom方式创建xml
  5. android sax解析 xml方式
  6. android pull 解析xml方式
  7. Java&Xml教程(三)使用DOM方式修改XML文件内容
  8. Java&Xml教程(二)使用DOM方式解析XML文件
  9. Java&Xml教程(四)使用DOM方式生成XML文件

随机推荐

  1. android.security Kotlin |Java
  2. android 静音方法
  3. android 输入法弹出键盘把listview顶上去
  4. android process information
  5. 蓝牙HID无线触摸屏
  6. Afinal 是一个android的sqlite orm 和 io
  7. Android bootloader—LK的分析之如何解析
  8. 初涉Android蓝牙开发 收藏以备后用
  9. Android 核心分析 之七------Service深入
  10. 在程序中设置android:gravity 和 android