Чтение XML с использованием XDocument & Linq - проверить, равен ли элемент NULL? - PullRequest
23 голосов
/ 07 апреля 2010

Я использую LINQ вместе с XDocument для чтения XML-файла.Это код:

XDocument xml = XDocument.Load(filename);

var q = from b in xml.Descendants("product")
        select new
        {
            name = b.Element("name").Value,
            price = b.Element("price").Value,                    
            extra = b.Element("extra1").Value,
            deeplink = b.Element("deepLink").Value                   
        };

Теперь проблема в том, что поле extra1 не всегда присутствует.В XML-файле есть элементы без этого узла.Если это происходит, происходит сбой с NullReferenceException.

Есть ли возможность включить «проверить, если ноль», чтобы я мог предотвратить его падение?

Ответы [ 4 ]

42 голосов
/ 07 апреля 2010

Используйте (string) вместо .Value:

var q = from b in xml.Descendants("product")
        select new
        {
            name = (string)b.Element("name"),
            price = (double?)b.Element("price"),                    
            extra = (string)b.Element("extra1"),
            deeplink = (string)b.Element("deepLink")                   
        };

Это также работает с другими типами данных , включая многие типы, допускающие значения NULL, если элемент присутствует не всегда.*

8 голосов
/ 08 апреля 2010

Вы можете использовать оператор "null coalescing":

var q = from b in xml.Descendants("product")
        select new
        {
            name = (string)b.Element("name") ?? "Default Name",
            price = (double?)b.Element("price") ?? 0.0,                    
            extra = (string)b.Element("extra1") ?? String.Empty,
            deeplink = (string)b.Element("deepLink") ?? String.Empty                   
        };

Таким образом, вы будете иметь полный контроль над значением по умолчанию, используемым при отсутствии элемента.

2 голосов
/ 11 сентября 2012

Используйте следующий пример для проверки существования любого элемента перед использованием этого элемента.

if( b.Elements("extra1").Any() )
{
   extra = b.Element("extra1").Value;
}
1 голос
/ 06 июля 2012

Вот пример примера для чтения XML-файла с использованием XDocument.

  XDocument objBooksXML = XDocument.Load(Server.MapPath("books.xml"));
    var objBooks = from book in
                   objBooksXML.Descendants("Book")
                   select new { 
                                Title = book.Element("Title").Value, 
                                Pages = book.Element("Pages").Value 
                              };

    Response.Write(String.Format("Total {0} books.", objBooks.Count()));
    gvBooks.DataSource = objBooks;
    gvBooks.DataBind();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...