Чтение XML с использованием XDocument & Linq - проверить, является ли элемент NULL?
Я использую 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 файле есть элементы без node. Если это происходит, это сбой с исключением NullReferenceException.
Есть ли возможность включить "check if null", чтобы я мог предотвратить ее сбой?
Ответы
Ответ 1
Используйте (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, если элемент не всегда присутствует.
Ответ 2
Вы можете использовать оператор "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
};
Таким образом, у вас будет полный контроль над значением по умолчанию, используемым, когда нет элемента.
Ответ 3
Используйте следующий пример для проверки существования какого-либо элемента перед использованием этого элемента.
if( b.Elements("extra1").Any() )
{
extra = b.Element("extra1").Value;
}
Ответ 4
Вот пример примера для чтения 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();