使用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字段。谢谢你的建议。
正确的方法是使用转换操作符:
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();