2009-06-04 2 views
3

Следующий код работает, но только до тех пор, пока каждый элемент XML имеет атрибут «Id».Как сообщить LINQ игнорировать атрибуты, которые не существуют?

Однако, если элемент не имеет атрибута id, LINQ генерирует исключение NullReferenceException.

Как указать, что, если нет атрибута идентификатора, просто назначьте нуль или пробел?

using System; 
using System.Linq; 
using System.Xml.Linq; 

namespace TestXmlElement2834 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      XElement content = new XElement("content", 
       new XElement("item", new XAttribute("id", "4")), 
       new XElement("item", new XAttribute("idCode", "firstForm")) 
       ); 

      var contentItems = from contentItem in content.Descendants("item") 
           select new ContentItem 
           { 
            Id = contentItem.Attribute("id").Value 

           }; 

      foreach (var contentItem in contentItems) 
      { 
       Console.WriteLine(contentItem.Id); 
      } 

      Console.ReadLine(); 


     } 
    } 

    class ContentItem 
    { 
     public string Id { get; set; } 
     public string IdCode { get; set; } 
    } 
} 
+0

(нашел красивый способ - см обновление) –

ответ

7

(вторая правка)

Ooh - нашел легкий способ ;-p

from contentItem in content.Descendants("item") 
    select new ContentItem 
    { 
     Id = (string)contentItem.Attribute("id") 
    }; 

Это работает благодаря гибким операторов статического преобразования на XAttribute и т.д.


(оригинал)

from contentItem in content.Descendants("item") 
    let idAttrib = contentItem.Attribute("id") 
    select new ContentItem 
    { 
     Id = idAttrib == null ? "" : idAttrib.Value 
    }; 

(первая правка)

Или добавить метод расширения:

static string AttributeValue(this XElement element, XName name) 
{ 
    var attrib = element.Attribute(name); 
    return attrib == null ? null : attrib.Value; 
} 

и использование:

from contentItem in content.Descendants("item") 
    select new ContentItem 
    { 
     Id = contentItem.AttributeValue("id") 
    }; 
+0

да , хорошо, я попробовал третичный оператор, но без «пусть» это не сработало, спасибо –

+0

запомнит, что (струнные) литье работает, отлично –

Смежные вопросы