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).
parent.CreateNavigator().InnerXml
(perluusing System.Xml.XPath
untuk metode ekstensi)..ToArray()
dalam.Concat
, tetapi tampaknya membuatnya lebih cepat.ToString()
per jawaban ini . Tampaknya lebih cepat ...var reader = parent.CreateReader();
dalam pernyataan menggunakan.Saya pikir ini adalah metode yang jauh lebih baik (dalam VB, seharusnya tidak sulit untuk diterjemahkan):
Diberikan XElement x:
sumber
Bagaimana kalau menggunakan metode "ekstensi" ini di XElement? bekerja untukku!
ATAU gunakan sedikit Linq
Catatan : Kode di atas harus digunakan
element.Nodes()
sebagai lawanelement.Elements()
. Sangat penting untuk mengingat perbedaan antara keduanya.element.Nodes()
memberi Anda segalanya sepertiXText
,XAttribute
dll, tetapiXElement
hanya sebuah Elemen.sumber
Dengan segala penghargaan kepada mereka yang menemukan dan membuktikan pendekatan terbaik (terima kasih!), Di sini dibungkus dengan metode ekstensi:
sumber
Tetap sederhana dan efisien:
sumber
Saya akhirnya menggunakan ini:
sumber
Secara pribadi, saya akhirnya menulis
InnerXml
metode ekstensi menggunakan metode Agregat:Kode klien saya kemudian sama singkatnya dengan namespace System.Xml yang lama:
sumber
@Reg: Tampaknya Anda telah mengedit jawaban Anda menjadi jawaban yang sama sekali berbeda. Untuk jawaban saya adalah ya, saya bisa melakukan ini dengan menggunakan System.Xml tetapi berharap kaki saya basah dengan LINQ ke XML.
Saya akan meninggalkan balasan asli saya di bawah ini jika ada orang lain yang bertanya-tanya mengapa saya tidak bisa hanya menggunakan properti .Nilai XElement untuk mendapatkan yang saya butuhkan:
@Reg: Properti Value merangkai semua konten teks dari simpul anak apa pun. Jadi, jika elemen tubuh hanya berisi teks berfungsi, tetapi jika mengandung XHTML saya mendapatkan semua teks disatukan tetapi tidak ada tag.
sumber
<root>random text <sub1>child</sub1> <sub2>child</sub2></root>
) yang menjadirandom text childchild
viaXElement.Parse(...).Value
// menggunakan Regex mungkin lebih cepat untuk hanya memotong tag elemen awal dan akhir
sumber
IndexOf
:var xml = root.ToString(); var begin = xml.IndexOf('>')+1; var end = xml.LastIndexOf('<'); return xml.Substring(begin, end-begin);
doc.ToString () atau doc.ToString (SaveOptions) berfungsi. Lihat http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.tostring(v=vs.110).aspx
sumber
Apakah mungkin untuk menggunakan objek namespace System.Xml untuk menyelesaikan pekerjaan di sini daripada menggunakan LINQ? Seperti yang sudah Anda sebutkan, XmlNode.InnerXml adalah persis apa yang Anda butuhkan.
sumber
Ingin tahu jika (perhatikan saya menyingkirkan b + = dan hanya memiliki b +)
mungkin sedikit kurang efisien daripada
Tidak 100% yakin ... tapi melirik Aggregate () dan string.Join () di Reflector ... Saya pikir saya membacanya sebagai Aggregate hanya menambahkan nilai kembali, jadi pada dasarnya Anda mendapatkan:
string = string + string
versus string. Bergabunglah, ada beberapa yang menyebutkan di sana tentang FastString Allocation atau sesuatu, yang membuat saya merasa orang-orang di Microsoft mungkin telah memberikan beberapa peningkatan kinerja tambahan di sana. Tentu saja .ToArray () saya meniadakan negasi saya itu, tetapi saya hanya ingin menawarkan saran lain.
sumber
kamu tahu? hal terbaik untuk dilakukan adalah kembali ke CDATA :( saya melihat solusi di sini tetapi saya pikir CDATA sejauh ini adalah yang paling sederhana dan termurah, bukan yang paling nyaman untuk dikembangkan dengan tho
sumber
Akan melakukan pekerjaan untukmu
sumber
sumber