XMLデータ読み込み方式の性能比較(1)

黄舟
リリース: 2017-02-13 15:43:58
オリジナル
1527 人が閲覧しました

ここ数ヶ月、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) に注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート