使用LINQ查询XML并使用null代替特定的xml属性(如果它不存在)

时间:2011-12-12 10:04:04

标签: c# xml linq

我有一个模型类

public class Item
{
    public string Name {get; set;}
    public string Desc {get; set;}
}

我会查询我的XML文档

List<Item> item = xmlDoc.Descendants()
    .Select(o => new Item { 
        Name = o.Attribute("name").Value, 
        Desc = o.Attribute("desc").Value
    }).ToList(); 

但是,每个项目可能存在或不存在属性 desc 。如果属性 desc 存在,则上述LINQ有效,但如果不存在则会导致异常。

如果它不存在,我希望LINQ查询只将 null 分配给新 Item 对象中的 Desc 字段。感谢您的任何建议。

2 个答案:

答案 0 :(得分:5)

执行此操作的正确方法是使用转换运算符:

Name = (string) o.Attribute("name"),
Desc = (string) o.Attribute("desc")

为什么这是首选方式?首先,它很容易;其次,它适用于其他类型:

Count = (int?) o.Attribute("count"),
When = (DateTime?) o.Attribute("when")

特别是,这些也为每种数据类型应用了正确的xml编码规则,而不是使用特定于文化的DateTime.Parse / int.Parse等等。许多微妙的事情都不想记住!< / p>

请注意,如果您想声明该属性存在,那么非Nullable<T>版本也可以使用:

Size = (int) o.Attribute("size"),
Created = (DateTime) o.Attribute("created")

答案 1 :(得分:1)

您可以使用三元运算符 - ?:

List<Item> item = xmlDoc.Descendants() 
    .Select(o => new Item {  
        Name = o.Attribute("name") != null ? o.Attribute("name").Value : null,  
        Desc = o.Attribute("desc") != null ? o.Attribute("desc").Value : null,
    }).ToList();