Eu queria ver qual dessas soluções sugeridas apresentava melhor desempenho e, portanto, realizei alguns testes comparativos. Por interesse, também comparei os métodos LINQ com o método System.Xml antigo simples sugerido por Greg. A variação foi interessante e não o que eu esperava, com os métodos mais lentos sendo três vezes mais lentos que os mais rápidos .
Os resultados ordenados pelo mais rápido para o mais lento:
- CreateReader - Caçador de Instâncias (0,131 segundos)
- System.Xml antigo simples - Greg Hurlman (0.134 segundos)
- Agregado com concatenação de strings - Mike Powell (0.324 segundos)
- StringBuilder - Vin (0,333 segundos)
- String.Join na matriz - Terry (0,360 segundos)
- String.Concat na matriz - Marcin Kosieradzki (0.364)
Método
Eu usei um único documento XML com 20 nós idênticos (chamados 'dica'):
<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>
Os números mostrados como segundos acima são o resultado da extração do "XML interno" dos 20 nós, 1000 vezes seguidas e da média (média) de 5 execuções. Não incluí o tempo necessário para carregar e analisar o XML em um XmlDocument
(para o método System.Xml ) ou XDocument
(para todos os outros).
Os algoritmos LINQ que usei foram: (C # - todos pegam um XElement
"pai" e retornam a cadeia XML interna)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Agregue com concatenação de cadeias:
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 na matriz:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat na matriz:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Não mostrei o algoritmo "Plain System.Xml antigo" aqui, pois ele está chamando .InnerXml nos nós.
Conclusão
Se o desempenho for importante (por exemplo, muito XML, analisado com freqüência), eu usaria o CreateReader
método de Daniel toda vez . Se você está apenas fazendo algumas consultas, convém usar o método Aggregate, mais conciso, de Mike.
Se você estiver usando XML em elementos grandes com muitos nós (talvez 100), você provavelmente começará a ver o benefício de usar StringBuilder
o método Aggregate, mas não o acabou CreateReader
. Eu não acho que os métodos Join
e Concat
seriam mais eficientes nessas condições devido à penalidade de converter uma lista grande em uma grande variedade (até óbvio aqui com listas menores).