Je voulais voir laquelle de ces solutions suggérées fonctionnait le mieux, j'ai donc effectué des tests comparatifs. Par intérêt, j'ai également comparé les méthodes LINQ à l'ancienne méthode System.Xml suggérée par Greg. La variation était intéressante et pas ce à quoi je m'attendais, les méthodes les plus lentes étant plus de 3 fois plus lentes que les plus rapides .
Les résultats classés du plus rapide au plus lent:
- CreateReader - Instance Hunter (0,113 seconde)
- Plain old System.Xml - Greg Hurlman (0,134 secondes)
- Agrégat avec concaténation de chaînes - Mike Powell (0,324 seconde)
- StringBuilder - Vin (0,333 seconde)
- String.Join on array - Terry (0,360 seconde)
- String.Concat sur tableau - Marcin Kosieradzki (0.364)
Méthode
J'ai utilisé un seul document XML avec 20 nœuds identiques (appelé `` indice ''):
<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>
Les nombres indiqués en secondes ci-dessus sont le résultat de l'extraction du "XML interne" des 20 nœuds, 1000 fois de suite, et de la moyenne (moyenne) de 5 exécutions. Je n'ai pas inclus le temps XmlDocument
nécessaire pour charger et analyser le XML dans un (pour la méthode System.Xml ) ou XDocument
(pour tous les autres).
Les algorithmes LINQ que j'ai utilisés étaient: (C # - tous prennent un XElement
"parent" et renvoient la chaîne XML interne)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Agréger avec concaténation de chaînes:
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 sur le tableau:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat sur tableau:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Je n'ai pas montré ici l'algorithme "Plain old System.Xml" car il appelle simplement .InnerXml sur les nœuds.
Conclusion
Si les performances sont importantes (par exemple, beaucoup de XML, analysé fréquemment), j'utiliserais la CreateReader
méthode de Daniel à chaque fois . Si vous ne faites que quelques requêtes, vous voudrez peut-être utiliser la méthode Aggregate plus concise de Mike.
Si vous utilisez XML sur des éléments volumineux avec beaucoup de nœuds (peut-être des centaines), vous commencerez probablement à voir l'avantage d'utiliser StringBuilder
la méthode Aggregate, mais pas plus CreateReader
. Je ne pense pas que les méthodes Join
et Concat
seraient jamais plus efficaces dans ces conditions en raison de la pénalité de convertir une grande liste en un grand tableau (même évident ici avec des listes plus petites).