Ich wollte sehen, welche dieser Lösungsvorschläge am besten funktioniert, und führte daher einige Vergleichstests durch. Aus Interesse habe ich auch die LINQ-Methoden mit der von Greg vorgeschlagenen einfachen System.Xml- Methode verglichen . Die Variation war interessant und nicht das, was ich erwartet hatte. Die langsamsten Methoden waren mehr als dreimal langsamer als die schnellsten .
Die Ergebnisse sortiert nach schnellsten bis langsamsten:
- CreateReader - Instance Hunter (0,113 Sekunden)
- Einfache alte System.Xml - Greg Hurlman (0,134 Sekunden)
- Aggregat mit String-Verkettung - Mike Powell (0,324 Sekunden)
- StringBuilder - Vin (0,333 Sekunden)
- String.Join on Array - Terry (0,360 Sekunden)
- String.Concat auf Array - Marcin Kosieradzki (0.364)
Methode
Ich habe ein einzelnes XML-Dokument mit 20 identischen Knoten verwendet (als "Hinweis" bezeichnet):
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
Die oben als Sekunden angezeigten Zahlen sind das Ergebnis des Extrahierens des "inneren XML" der 20 Knoten, 1000 Mal hintereinander, und des Durchschnitts (Mittelwerts) von 5 Läufen. Ich habe nicht die Zeit angegeben, die zum Laden und Parsen des XML in eine XmlDocument
(für die System.Xml- Methode) oder XDocument
(für alle anderen) benötigt wurde.
Die von mir verwendeten LINQ-Algorithmen waren: (C # - alle nehmen ein XElement
"übergeordnetes Element" und geben die innere XML-Zeichenfolge zurück)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Aggregat mit Zeichenfolgenverkettung:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join on Array:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat auf Array:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Ich habe den Algorithmus "Plain old System.Xml" hier nicht gezeigt, da er nur .InnerXml auf Knoten aufruft.
Fazit
Wenn die Leistung wichtig ist (z. B. viel XML, häufig analysiert), würde ich jedes Mal Daniels CreateReader
Methode verwenden . Wenn Sie nur ein paar Abfragen durchführen, möchten Sie möglicherweise Mikes präzisere Aggregatmethode verwenden.
Wenn Sie XML für große Elemente mit vielen Knoten (möglicherweise 100) verwenden, werden Sie wahrscheinlich den Vorteil der Verwendung StringBuilder
gegenüber der Aggregatmethode erkennen, jedoch nicht über CreateReader
. Ich denke nicht, dass die Methoden Join
und unter Concat
diesen Bedingungen jemals effizienter wären, da die Konvertierung einer großen Liste in ein großes Array die Strafe darstellt (auch hier bei kleineren Listen offensichtlich).