Saya ingin melihat solusi mana yang disarankan yang paling berhasil, jadi saya menjalankan beberapa tes perbandingan. Karena ketertarikan, saya juga membandingkan metode LINQ dengan metode System.Xml tua yang disarankan oleh Greg. Variasi itu menarik dan bukan yang saya harapkan, dengan metode paling lambat lebih dari 3 kali lebih lambat daripada yang tercepat .
Hasil yang dipesan paling cepat hingga paling lambat:
- CreateReader - Pemburu Instance (0,113 detik)
- System.Xml tua polos - Greg Hurlman (0,134 detik)
- Agregat dengan penggabungan string - Mike Powell (0,324 detik)
- StringBuilder - Vin (0,333 detik)
- String.Gabung di larik - Terry (0,360 detik)
- String.Compat pada larik - Marcin Kosieradzki (0.364)
metode
Saya menggunakan dokumen XML tunggal dengan 20 node identik (disebut 'hint'):
<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>
Angka-angka yang ditunjukkan sebagai detik di atas adalah hasil dari mengekstraksi "XML dalam" dari 20 node, 1000 kali berturut-turut, dan mengambil rata-rata (rata-rata) dari 5 run. Saya tidak memasukkan waktu yang diperlukan untuk memuat dan mem-parsing XML ke dalam XmlDocument
(untuk metode System.Xml ) atau XDocument
(untuk semua yang lain).
Algoritma LINQ yang saya gunakan adalah: (C # - semua mengambil XElement
"induk" dan mengembalikan string XML dalam)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Agregat dengan penggabungan string:
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.Gabung di array:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat pada array:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Saya belum menunjukkan algoritma "Plain old System.Xml" di sini karena hanya memanggil .InnerXml pada node.
Kesimpulan
Jika kinerjanya penting (misalnya banyak XML, sering diuraikan), saya akan menggunakan CreateReader
metode Daniel setiap waktu . Jika Anda hanya melakukan beberapa pertanyaan, Anda mungkin ingin menggunakan metode Agregat Mike yang lebih ringkas.
Jika Anda menggunakan XML pada elemen besar dengan banyak node (mungkin 100-an), Anda mungkin akan mulai melihat manfaat menggunakan StringBuilder
lebih dari metode Agregat, tetapi tidak lebih CreateReader
. Saya tidak berpikir Join
dan Concat
metode akan lebih efisien dalam kondisi ini karena penalti mengubah daftar besar ke array besar (bahkan jelas di sini dengan daftar yang lebih kecil).