ホームページ >バックエンド開発 >XML/RSS チュートリアル >XMLデータ読み込み方式の性能比較(1)
ここ数ヶ月、SOAのせいでxml操作ばかり扱っていて、SQLのことはほとんど忘れていました。現在、一般的に使用されている XML データ操作メソッド (Java と同様) が少なくとも 4 つあることが知られていますが、これらのメソッドの特性や長所と短所を実際に比較したことはありません。たまたまネット上でこの分野の実験がなかったのを見かけたのでまとめてみます。
XML ソースを読み取り、比較的大きな RSS ファイル リンクを使用して、それをプロジェクトの bin/debug ディレクトリにコピーすることでテストを開始します。
Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));
一.
コード
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 }
IV.Linq to XMLメソッド
コード
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 }
テスト結果:
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 }
私の理解を要約すると、XmlDocument の操作は基本的に次のとおりです。 W3C DOM 操作方法ですが、すべてのノードをオブジェクトに解析してメモリにロードする必要があるため、多くの場合無駄が発生します。したがって、Microsoft 独自のプログラミング標準では、その使用を推奨していません。ここではすべてのノードが読み取られるため、パフォーマンスは Navigator 方式とあまり変わらない可能性があります。 3 つのランダム読み取りメソッドの中で、Xml Linq が最もパフォーマンスが高いのですが、メソッド名が少しわかりにくいです。 XmlTextReader メソッドは、いわゆる SAX であり、読み取り専用で最もパフォーマンスが高いですが、アクセス ロジックをより正確に制御する必要があり、匿名クラスを使用して保存することはできません。データ。
.Net 3.5 リリースの Xml Linq は、最初の 2 つのメソッドをうまく置き換えることができます。通常の状況では、これを使用するのが最善です。パフォーマンス要件が非常に高い場合、または読み取られる XML データの量が大きすぎて一度にダウンロードしたりメモリに読み込んだりできない場合は、XmlTextReader にコミットする必要があります。
上記は XML データ読み取り方法のパフォーマンス比較 (1) です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。