1

我使用 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 元素......在这种情况下,我想使用查询附加条件。

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

如果他们遇到过这种情况,谁能给我一个想法。

4

1 回答 1

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);
于 2012-07-09T15:53:32.977 回答