Bu önerilen çözümlerden hangisinin en iyi performansı gösterdiğini görmek istedim, bu yüzden bazı karşılaştırmalı testler yaptım. İlgi dışında, LINQ yöntemlerini Greg tarafından önerilen düz eski System.Xml yöntemiyle de karşılaştırdım . Varyasyon ilginçti ve beklediğim gibi değildi, en yavaş yöntemler en hızlıdan 3 kat daha yavaştı .
En hızlıdan en yavaşa sıralanan sonuçlar:
- CreateReader - Örnek Avcısı (0.113 saniye)
- Düz eski System.Xml - Greg Hurlman (0.134 saniye)
- Dize birleştirme ile toplama - Mike Powell (0,324 saniye)
- StringBuilder - Vin (0.333 saniye)
- String.Join on array - Terry (0.360 saniye)
- String.Concat on array - Marcin Kosieradzki (0.364)
Yöntem
20 özdeş düğüme sahip tek bir XML belgesi kullandım ('ipucu' adı verilir):
<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>
Yukarıda saniye olarak gösterilen sayılar, 20 düğümün "iç XML" sinin arka arkaya 1000 kez çıkarılmasının ve 5 çalışmanın ortalamasının (ortalama) alınmasının sonucudur. XML'yi yüklemek ve ayrıştırmak için geçen süreyi bir XmlDocument( System.Xml yöntemi için) veya XDocument(diğerlerinin tümü için) eklemedim .
Kullandığım LINQ algoritmaları şunlardı: (C # - hepsi bir XElement"ebeveyn" alır ve iç XML dizesini döndürür)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Dize birleştirme ile toplayın:
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 dizide:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Sadece düğümlerde .InnerXml'yi çağırdığı için "Düz eski System.Xml" algoritmasını burada göstermedim.
Sonuç
Performans önemliyse (örneğin, sık sık ayrıştırılan çok sayıda XML), Daniel'ınCreateReader yöntemini her seferinde kullanırdım . Yalnızca birkaç sorgu yapıyorsanız, Mike'ın daha özlü Aggregate yöntemini kullanmak isteyebilirsiniz.
XML'i çok sayıda düğüme (belki 100'ler) sahip büyük öğelerde kullanıyorsanız, muhtemelen StringBuilderAggregate yönteminden daha fazla kullanmanın faydasını görmeye başlarsınız , ancak bitmiyor CreateReader. Büyük bir listeyi büyük bir diziye dönüştürme cezası nedeniyle (burada daha küçük listelerde bile açık) Joinve Concatyöntemlerinin bu koşullarda daha verimli olacağını sanmıyorum .