2010-12-02 29 views
10
<books> 
    <book name="Christmas Cheer" price="10" /> 
    <book name="Holiday Season" price="12" /> 
    <book name="Eggnog Fun" price="5" special="Half Off" /> 
</books> 

kontrol edilmesi ve diğer insanların özel işlemek için kullandığınız yöntemler merak ediyorum. Bu çalışmanın Benim şu anki yoludur: Bu çözmek için daha iyi yolları olup olmadığını merak ediyorumLinq To Xml Boş Bunu kullanarak linq ayrıştırmak istiyorum nitelikler

var books = from book in booksXml.Descendants("book") 
         let Name = book.Attribute("name") ?? new XAttribute("name", string.Empty) 
         let Price = book.Attribute("price") ?? new XAttribute("price", 0) 
         let Special = book.Attribute("special") ?? new XAttribute("special", string.Empty) 
         select new 
            { 
             Name = Name.Value, 
             Price = Convert.ToInt32(Price.Value), 
             Special = Special.Value 
            }; 

.

sayesinde

  • Jared

cevap

11

Özniteliği string'a atayabilirsiniz. Eğer yoksa, null'u alırsınız ve sonraki kod null'u kontrol etmelidir, aksi takdirde değeri doğrudan döndürecektir.

yerine bu deneyin: C# 6.0

var books = from book in booksXml.Descendants("book") 
      select new 
      { 
       Name = (string)book.Attribute("name"), 
       Price = (string)book.Attribute("price"), 
       Special = (string)book.Attribute("special") 
      }; 
+0

yanında aşırı yük var Bu harika! Onu seviyorum. Teşekkürler. – Howel

4

eksik nitelik durumlarda saklanması bir uzantısı yöntemi kullanarak nereden: Bu sadece T eğer çalışacağını

public static class XmlExtensions 
{ 
    public static T AttributeValueOrDefault<T>(this XElement element, string attributeName, T defaultValue) 
    { 
     var attribute = element.Attribute(attributeName); 
     if (attribute != null && attribute.Value != null) 
     { 
      return (T)Convert.ChangeType(attribute.Value, typeof(T)); 
     } 

     return defaultValue; 
    } 
} 

Not türüdür hangi dizinin IConvertible üzerinden dönüştürüleceğini bilir. Daha genel dönüşüm durumlarını desteklemek istiyorsanız, bir TypeConverter de aramanız gerekebilir. Bu, tür dönüştürülmezse, bir istisna atar. Bu durumların da varsayılanı döndürmesini istiyorsanız, ek hata işleme gerçekleştirmeniz gerekir.

+0

Bu konuda bir varyant kullandım, ancak 'XAttribute Attribute (bu XElement öğesi, XName adı, T defaultValue)' kullanılır. Başarısız olursa, yeni bir XAttribute (ad, defaultValue); Sonra orijinal –

0

Eğer örnekte uygulamadan sonra monadic Null-şartlı operatörü ?. kullanabilirsiniz bu şekilde görünecektir:

var books = from book in booksXml.Descendants("book") 
      select new 
      { 
       Name = book.Attribute("name")?.Value ?? String.Empty, 
       Price = Convert.ToInt32(book.Attribute("price")?.Value ?? "0"), 
       Special = book.Attribute("special")?.Value ?? String.Empty 
      }; 

Okuyabiliyorsun daha fazla here Kısmen koşullu işleçler başlıklı.