使用LINQ查询XML,如果特定的XML属性不存在,则使用null代替该属性

本文关键字:属性 XML null 查询 LINQ 如果 使用 不存在 | 更新日期: 2023-09-27 18:17:47

我有一个模型类

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字段。谢谢你的建议。

使用LINQ查询XML,如果特定的XML属性不存在,则使用null代替该属性

正确的方法是使用转换操作符:

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等。很多微妙的事情不想记住!

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

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

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

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();