Maison >développement back-end >Tutoriel XML/RSS >Comparaison des performances des méthodes de lecture de données XML (1)

Comparaison des performances des méthodes de lecture de données XML (1)

黄舟
黄舟original
2017-02-13 15:43:581569parcourir

Ces derniers mois, je me suis occupé d'opérations XML dues à SOA, et j'ai presque tout oublié de SQL. On sait désormais qu'il existe au moins quatre méthodes de manipulation de données XML couramment utilisées (similaires à Java), mais les caractéristiques, avantages et inconvénients de chacune de ces méthodes n'ont pas réellement été comparés. Il m'est arrivé de constater qu'il n'y avait pas d'expériences dans ce domaine sur Internet, je vais donc le résumer.

Au début du test, lisez d'abord la source XML, utilisez un lien de fichier rss relativement volumineux et copiez-le dans le répertoire bin/debug du projet.

Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));

  

1. Méthode XmlDocument

Code

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 }

2. Méthode XPathNavigator

Code

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 }

3. Méthode XmlTextReader

Code

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 }

4. Linq to Méthode XML

code

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 }

Résultats des tests :

XmlDocment    47ms    
XPathNavigator    42ms    
XmlTextReader    23ms    
Xml Linq    28ms

Pour résumer ma compréhension, XmlDocument Le fonctionnement suit essentiellement la méthode de fonctionnement du W3C DOM, mais tous les nœuds doivent être analysés en objets et chargés en mémoire, ce qui entraîne souvent beaucoup de gaspillage. Par conséquent, les propres normes de programmation de Microsoft ne recommandent pas son utilisation. Puisque tous les nœuds sont lus ici, les performances peuvent ne pas être très différentes de celles de la méthode Navigator. Parmi les trois méthodes de lecture aléatoire, Xml Linq a les performances les plus élevées, mais le nom de la méthode est un peu gênant. La méthode XmlTextReader est ce qu'on appelle SAX, qui est en lecture seule et offre les performances les plus élevées. Cependant, sa mise en œuvre est très difficile. La logique d'accès doit être contrôlée avec plus de précision et les classes anonymes ne peuvent pas être utilisées pour le stockage. données.

La version .Net 3.5 Xml Linq peut très bien remplacer les deux premières méthodes, dans des circonstances normales, il est préférable de l'utiliser. Seulement dans certains cas, si les exigences de performances sont extrêmement élevées ou si la quantité de données XML à lire est trop importante pour être téléchargée ou lue dans la mémoire en une seule fois, vous devez alors vous engager envers XmlTextReader.

Ce qui précède est la comparaison des performances des méthodes de lecture de données XML (1). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn