如何处理LINQ to XML查询中的缺失节点

时间:2011-07-07 17:35:24

标签: c# linq-to-xml

以下示例说明了在缺少数据时如何为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")
    };

2 个答案:

答案 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的优秀答案的附属品。这可能对我困境中的其他人有所帮助。这大大减少了我的解析代码,所以这是一个很好的解决方案。