以下示例说明了在缺少数据时如何为LINQ to XML查询设置默认值:
IEnumerable<Person> persons =
from e in x.Descendants("Person")
select new Person {
Name = e.Value,
Age = (int?)e.Attribute("Age") ?? 21
};
但是,当一个属性完全丢失时,你如何处理?例如,如果节点没有父节点,该怎么办?
IEnumerable<Person> persons =
from e in x.Descendants("Person")
select new Person {
Name = e.Value,
Age = (int?)e.Attribute("Age") ?? 21
ParentAge = e.Parent.Attribute("Age")
};
答案 0 :(得分:3)
你通过ternary conditional operator:
以艰难的方式处理它IEnumerable<Person> persons =
from e in x.Descendants("Person")
select new Person {
Name = e.Value,
Age = (int?) e.Attribute("Age") ?? 21,
ParentAge = e.Parent != null ? (int) e.Parent.Attribute("Age") : 42
};
据我所知,在C#中没有更短的方法。
答案 1 :(得分:0)
在我的情况下,我必须检查是否存在“Notes”节点并处理这两种情况,以及文本字符串中的任何撇号(此代码用于创建MySQL插入字符串)。如果字符串存在于单引号中并且将任何撇号更改为加倍,则将其括起来,或者如果该节点不存在则简单地插入NULL。我无法控制创建XML文件的XML客户端,而且我已经完成了数以万计的解析,所以这就是我想出来的:
var items =
from e in creationItems
select new
{
//other values
Notes = e.Descendants("Notes").Any() ? "'" + e.Descendants("Notes").First().Value.Replace("'", "''") + "'" : "NULL"
};
我无法弄清楚如何正确添加这个作为评论,所以这只是@FrédéricHamidi的优秀答案的附属品。这可能对我困境中的其他人有所帮助。这大大减少了我的解析代码,所以这是一个很好的解决方案。