LINQ to XML的条件查询

时间:2012-07-09 15:34:54

标签: c# linq-to-xml

我使用LINQ to XML删除标签并将其插入到xml文档中。我经常遇到的一种情况是,我有一个首选项,我想插入一个特定的标签,但不能总是满足这种偏好。例如,我希望在具有相同CalendarCode的最后一个元素之后插入它:

elements = from e in calendarDocument.Descendants("ExceptionalSessions") where e.Element("CalendarCode") == calendarCode select e;

elements.Last().AddAfterSelf(sessionElement);

然而,有时要插入的元素是该文档中具有该CalendarCode的第一个这样的额外条件:

where e.Element("CalendarCode") == calendarCode  

将创建一个空结果集。在这种情况下,我想使用查询而不是这个附加条件。这是一次性的事情,但是在插入带有该日历代码的元素之后我想要在第一个元素之后插入相同的CalendarCode的NEXT元素...在这种情况下我想要使用查询 附加条件。

我尝试了几种方法来解决这个问题,但它们看起来都非常粗糙,可能效率低下,我无法帮助,但认为有更好的方法。

任何人都可以告诉我他们是否遇到过此事。

1 个答案:

答案 0 :(得分:2)

一种选择是在添加之前评估条件并确定目标。为清晰起见,使用单独的方法,可能是这样的(未经测试):

private XElement GetCalendarTargetNode(XElement source, XElement calendarCode)
        {
            var exceptionalSessions = source.Descendants("ExceptionalSessions");
            return exceptionalSessions.LastOrDefault(e => e.Element("CalendarCode") == calendarCode) ?? exceptionalSessions.Last();
        }

或者稍微不同的实现:

private XElement GetCalendarTargetNode(XElement source, XElement calendarCode)
        {
            var exceptionalSessions = source.Descendants("ExceptionalSessions");
            return exceptionalSessions.Where(e => e.Element("CalendarCode") == calendarCode).DefaultIfEmpty(exceptionalSessions.Last()).Last();
        }

并使用它:

var target = GetCalendarTargetNode(calendarDocument, calendarCode);
target.AddAfterSelf(sessionElement);

修改 或者不使用额外方法的简化版本:

    var exceptionalSessions = calendarDocument.Descendants("ExceptionalSessions");
    var target = exceptionalSessions.Where(e => e.Element("CalendarCode") == calendarCode)
        .DefaultIfEmpty(exceptionalSessions.Last());
    target.Last().AddAfterSelf(sessionElement);