Heim > Backend-Entwicklung > XML/RSS-Tutorial > Leistungsvergleich von XML-Datenlesemethoden (1)

Leistungsvergleich von XML-Datenlesemethoden (1)

黄舟
Freigeben: 2017-02-13 15:43:58
Original
1566 Leute haben es durchsucht

In den letzten Monaten habe ich mich aufgrund von SOA mit XML-Operationen beschäftigt und SQL fast vergessen. Es ist mittlerweile bekannt, dass es mindestens vier häufig verwendete XML-Datenbearbeitungsmethoden (ähnlich wie Java) gibt, die Eigenschaften, Vor- und Nachteile jeder dieser Methoden wurden jedoch nicht tatsächlich verglichen. Ich habe zufällig gesehen, dass es im Internet keine Experimente in diesem Bereich gibt, daher werde ich es zusammenfassen.

Lesen Sie zu Beginn des Tests die XML-Quelle, verwenden Sie einen relativ großen RSS-Dateilink und kopieren Sie ihn in das Projektverzeichnis bin/debug.

Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));
Nach dem Login kopieren

  

1. XmlDocument-Methode

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 }
Nach dem Login kopieren

2. XPathNavigator-Methode

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 }
Nach dem Login kopieren

3. XmlTextReader-Methode

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 }
Nach dem Login kopieren

4. Linq to XML-Methode

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 }
Nach dem Login kopieren

Testergebnisse:

XmlDocment    47ms    
XPathNavigator    42ms    
XmlTextReader    23ms    
Xml Linq    28ms
Nach dem Login kopieren

Um mein Verständnis zusammenzufassen, XmlDocument Die Operation folgt grundsätzlich der W3C-DOM-Betriebsmethode, aber alle Knoten müssen in Objekte analysiert und in den Speicher geladen werden, was oft zu viel Verschwendung führt. Daher empfehlen die eigenen Programmierstandards von Microsoft die Verwendung nicht. Da hier alle Knoten gelesen werden, unterscheidet sich die Leistung möglicherweise nicht wesentlich von der Navigator-Methode. Unter den drei zufälligen Lesemethoden weist Xml Linq die höchste Leistung auf, der Methodenname ist jedoch etwas umständlich. Die XmlTextReader-Methode ist die sogenannte SAX, die schreibgeschützt ist und die höchste Leistung aufweist. Die Zugriffslogik muss jedoch genauer gesteuert werden, und anonyme Klassen können nicht zum Speichern verwendet werden Daten.

.Net 3.5 Release XML Linq kann die ersten beiden Methoden sehr gut ersetzen, es ist am besten, es zu verwenden. Nur in einigen Fällen, wenn die Leistungsanforderungen extrem hoch sind oder die Menge der zu lesenden XML-Daten zu groß ist, um sie auf einmal herunterzuladen oder in den Speicher einzulesen, müssen Sie sich auf XmlTextReader festlegen.

Das Obige ist der Leistungsvergleich der XML-Datenlesemethoden (1). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage