具有嵌套循环的Linq XML查询 - 1

时间:2012-05-21 19:11:12

标签: c# xml linq

this question中,如果我需要在输出中包含“日期”,应该进行哪些更改?

当我加入时

let dt = l.Element("Date").Value

它给出了“对象引用未设置为对象的实例”

var query = from l in doc.Descendants("L1")
            let dt = l.Element("Date").Value
            let id = l.Attribute("id").Value
            from subject in l.Descendants("Subject")
            select new
            {
                Date = dt,
                Id = id,
                SubjectName = (string)subject.Attribute("SubjectName"),
                Score = (string)subject.Attribute("Score")
            };


foreach (var result in query)
{
    Console.WriteLine(result);
}

3 个答案:

答案 0 :(得分:2)

如果l没有Date元素,则尝试访问l.Element("Date").Value会导致错误。您可以使用条件:

var query = from l in doc.Descendants("L1")
        let dt = l.Elements("date").Any() 
                 ? l.Element("date").Value
                 : AnyDefaultValueIWantForDate
        let id = l.Attribute("id").Value
        from subject in l.Descendants("Subject")
        select new
        {
            Date = dt,
            Id = id,
            SubjectName = subject.Attribute("SubjectName").Value,
            Score = subject.Attribute("Score").Value
        };

(我还在.ValueSubjectName中添加了Score

答案 1 :(得分:1)

假设l不为空,则l.Element("Date")为空,这意味着您的一个或多个L1元素没有子Date元素。

修复将取决于您想要对缺少的日期做什么。如果您想将default(DateTime)用作“魔术”日期,则可以执行以下操作:

let dt = (l.Element("Date") == null ? default(DateTime) : l.Element("Date").Value)

答案 2 :(得分:1)

看看你的其他XML,正如Skeet先生提到的那样,它没有<date>元素中的任何内容。如果您不打算总是在那里有数据,则需要明确处理。

您可以这样做:

let dt = l.Element("date") == null ? string.Empty : l.Element("date").Value