SORU
6 AĞUSTOS 2008, ÇARŞAMBA


İyi bir XElement InnerXml şansı olur mu?

Kod body karışık öğesinin içeriğini altına almak için en iyi yolu nedir? Eleman da XHTML veya metin içerebilir, ama ben sadece dize şeklinde içeriğini istiyorum. XmlElement tip değilim sonra tam olarak hangi InnerXml özelliği vardır.

Yazılı kodneredeyseben ne istiyor, ama istemiyorum sadece <body>...</body> çevre öğesi içerir.

XDocument doc = XDocument.Load(new StreamReader(s));
var templates = from t in doc.Descendants("template")
                where t.Attribute("name").Value == templateName
                select new
                {
                   Subject = t.Element("subject").Value,
                   Body = t.Element("body").ToString()
                };

CEVAP
9 Kasım 2009, PAZARTESİ


Bazı karşılaştırmalı testler yaptım iyi performansı görmek istedim. Dışarı çıkar, ben de sade yaşlı bu SERİ yöntemleri karşılaştırıldıSystem.Xmlyöntem Greg tarafından önerilen. Değişim bekliyordum ne ilginç değil, yöntemlerinden olmak3 kat daha hızlı daha yavaş.

Sonuçlarına göre en hızlı en yavaş emretti

  1. CreateReader - Örnek Avcı (0.113 saniye)
  2. Düz eski System.Xml - Greg Hurlman (0.134 saniye)
  3. Dize birleştirme - Mike Powell (0.324 saniye) ile toplama
  4. StringBuilder - Vin (0.333 saniye)
  5. String.Dizi - Terry (0.360 saniye) katılın
  6. String.Dizi hakkında herhangi bir parametre - Anna Kosieradzki (0.364)

Yöntem

20 aynı düğüm ile tek bir XML belge kullandım ('') ipucu:

<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ıdaki rakamları saniye olarak gösterilen "" üst üste 20 düğümleri, 1000 kere, ortalama 5 çalışır alıyor. iç XML çıkarmanın sonucu Yük ve XmlDocument (. XML ayrıştırma için aldığın zaman katmadım ^strong>System.Xmlyöntemi) veya XDocument (diğerleri için).

Kontrol ETMENİZ ... ... kullanılan algoritmalar:XElement bir "üst" ve iç XML dizesi döndürür). (# - C

CreateReader:

var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();

Dize birleştirme ile toplama:

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.Dizi katılmak:

return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());

String.Dizi hakkında herhangi bir parametre:

return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());

"Düz eski system.xml sadece arıyor gibi." burada algoritma göstermedim Düğümlerde ınnerxml.


Sonuç

Eğer performans önemli (örneğin XML çok sık ayrıştırılmış) ise, isterimkullanım Daniel CreateReader Her zaman yöntemi. Eğer sadece bir kaç sorgu yapıyorsanız, Mike'ın daha kısa Toplama yöntemi kullanmak isteyebilirsiniz.

Kullanıyorsanız XML büyük öğeleri bir sürü düğüm (belki 100), muhtemelen başlamak için görmek yararına kullanılması StringBuilder üzerinde Toplama yöntemi, ama daha bitmedi CreateReader. Sanmıyorum Join Concat yöntemleri ... sanki daha etkili bu koşullar nedeniyle ceza dönüştürme büyük bir liste için büyük bir dizi (hatta bariz burada küçük listeler).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boniver

    boniver

    17 NİSAN 2006
  • Eric Enge

    Eric Enge

    2 Kasım 2009
  • Excel Video Tutorials

    Excel Video

    6 Aralık 2012