Quería ver cuál de estas soluciones sugeridas funcionaba mejor, así que realicé algunas pruebas comparativas. Por interés, también comparé los métodos LINQ con el antiguo método System.Xml sugerido por Greg. La variación fue interesante y no era lo que esperaba, ya que los métodos más lentos son más de 3 veces más lentos que los más rápidos .
Los resultados ordenados por más rápido a más lento:
- CreateReader - Instance Hunter (0.113 segundos)
- System.Xml simple y antiguo - Greg Hurlman (0.134 segundos)
- Agregado con concatenación de cadenas - Mike Powell (0.324 segundos)
- StringBuilder - Vin (0.333 segundos)
- String.Join on array - Terry (0.360 segundos)
- String.Concat on array - Marcin Kosieradzki (0.364)
Método
Usé un solo documento XML con 20 nodos idénticos (llamado 'sugerencia'):
<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>
Los números que se muestran como segundos arriba son el resultado de extraer el "XML interno" de los 20 nodos, 1000 veces seguidas, y tomar el promedio (media) de 5 ejecuciones. No incluí el tiempo que tardó en cargar y analizar el XML en un XmlDocument
(para el método System.Xml ) oXDocument
(para todos los demás).
Los algoritmos LINQ que utilicé fueron: (C #: todos toman un XElement
"padre" y devuelven la cadena XML interna)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Agregado con concatenación de cadenas:
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 en matriz:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat en la matriz:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
No he mostrado el algoritmo "Plain old System.Xml" aquí, ya que solo está llamando a .InnerXml en los nodos.
Conclusión
Si el rendimiento es importante (por ejemplo, mucho XML, analizado con frecuencia), usaría el CreateReader
método de Daniel cada vez . Si solo está haciendo algunas consultas, es posible que desee utilizar el método agregado más conciso de Mike.
Si está utilizando XML en elementos grandes con muchos nodos (tal vez 100), probablemente comenzará a ver el beneficio de usar StringBuilder
sobre el método Aggregate, pero no más CreateReader
. No creo que los métodos Join
y Concat
sean más eficientes en estas condiciones debido a la penalidad de convertir una lista grande en una gran matriz (incluso obvio aquí con listas más pequeñas).