处理linq中的null元素

时间:2015-01-05 23:22:38

标签: c# linq linq-to-xml

我正在读取XML中的数据。我遇到了一个值为null的问题,我不确定处理它的最佳方法。下面是一段代码。街道地址2在此XML中不存在,但在其他XML中则存在,因此我需要使其足够动态以处理这两个实例。

var storeInfo = storeRows.Descendants("Store").Select(s => new
{
    storeName = s.Element("StoreName").Value,
    streetAddress1 = s.Element("StreetAddress1").Value,
    streetAddress2 = s.Element("StreetAddress2").Value
});
{
    foreach (var st in storeInfo)
    {
        alStoreName.Add(st.storeName.ToString());
        alStreet1.Add(st.StreetAddress1.ToString());
        alStreet2.Add(st.StreetAddress2.ToString());
    }
}

2 个答案:

答案 0 :(得分:4)

使用显式转换而不是访问Value属性

var storeInfo = storeRows.Descendants("Store").Select(s => new
{
    storeName = (string)s.Element("StoreName"),
    streetAddress1 = (string)s.Element("StreetAddress1"),
    streetAddress2 = (string)s.Element("StreetAddress2")
});

如果元素不存在,这将返回null

此外,我建议您创建一个class来封装商店信息,而不是将信息存储在不同的列表中。然后,只需列出storeInfo'而不是匿名类型列表:

var storeInfo = storeRows.Descendants("Store").Select(s => new StoreInfo
{
    storeName = (string)s.Element("StoreName"),
    streetAddress1 = (string)s.Element("StreetAddress1"),
    streetAddress2 = (string)s.Element("StreetAddress2")
});

答案 1 :(得分:3)

您应该使用(string)XElement显式转换而不是Value属性。当元素不存在时,它将返回null

streetAddress2 = (string)s.Element("StreetAddress2")

您可以将XElement投射到上面的大部分原始类型stringDateTimeGuidNullable<T>。请在此处查看完整列表:XElement Type Conversions

同样的规则适用于XAttribute