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

Ron*_*ald 2 c# xml linq

我有一个模特课

public class Item
{
    public string Name {get; set;}
    public string Desc {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我会查询我的XML文档

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

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

如果它不存在,我希望LINQ查询只将null赋给新Item对象中的Desc字段.谢谢你的任何建议.

Mar*_*ell 5

正确的方法是使用转换运算符:

Name = (string) o.Attribute("name"),
Desc = (string) o.Attribute("desc")
Run Code Online (Sandbox Code Playgroud)

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

Count = (int?) o.Attribute("count"),
When = (DateTime?) o.Attribute("when")
Run Code Online (Sandbox Code Playgroud)

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

请注意,如果要断言属性存在,则非Nullable<T>版本也可以工作:

Size = (int) o.Attribute("size"),
Created = (DateTime) o.Attribute("created")
Run Code Online (Sandbox Code Playgroud)