2010-12-02 11 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> 

Ich mag würde dies mit Linq analysieren, und ich bin gespannt, welche Methoden andere Menschen besondere Handhabung verwenden. Meine derzeitige Arbeitsweise ist:Linq to XML Null Überprüfung von Attributen

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 
            }; 

Ich frage mich, ob es bessere Möglichkeiten gibt, das zu lösen.

Danke,

  • Jared

Antwort

11

Sie können das Attribut in eine string umwandeln. Wenn es nicht vorhanden ist, erhalten Sie null und nachfolgenden Code sollte für null überprüfen, sonst wird es den Wert direkt zurückgeben.

Versuchen Sie stattdessen:

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

Das ist super! Ich liebe es. Vielen Dank. – Howel

4

Wie über eine Erweiterungsmethode mit den fehlenden Attribut Fällen kapseln:

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; 
    } 
} 

Beachten Sie, dass dies nur, wenn T arbeiten ist eine Art zu welchem ​​String er über IConvertible konvertieren kann. Wenn Sie allgemeinere Konvertierungsfälle unterstützen möchten, müssen Sie möglicherweise auch nach einem TypeConverter suchen. Dies führt zu einer Ausnahme, wenn der Typ nicht konvertiert werden kann. Wenn Sie möchten, dass diese Fälle auch den Standardwert zurückgeben, müssen Sie eine zusätzliche Fehlerbehandlung durchführen.

+0

Ich verwendete eine Variante für diese, aber verwendet 'XAttribute Attribut (dieses XElement-Element, XName-Name, T defaultValue)'. Wenn dies fehlschlägt, erstellen Sie ein 'neues XAttribute (name, defaultValue);'. Dann ist die Überladung neben dem Original –

0

In C# 6.0 Sie können monadischen Null-Konditionaloperator ?. verwenden Nachdem es in Ihrem Beispiel ihre Anwendung würde wie folgt aussehen:

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 
      }; 

Sie lesen können mehr here im Teil mit Null-bedingten Operatoren.