这可以通过 LINQ to XML 实现吗?
我有一个
List<Congregation>
对象,并且我获得了最后邀请日期早于今天的所有项目的列表:
var congs =_CongregationData.Congregations
.Where(a => a.LastInvited < DateTime.Today)
这是第 1 步。但是我还有另一个 XML 文件。这是一个简化的示例(忽略日期,因为它们是虚构的):
<AssignmentHistory>
<W20230504>
<PublicTalkInfo>
<MeetingDate>2023-05-07</MeetingDate>
<PublicTalkCongregation>To Be Confirmed</PublicTalkCongregation>
</PublicTalkInfo>
</W20230504>
<W20230504>
<PublicTalkInfo>
<MeetingDate>2023-05-07</MeetingDate>
<PublicTalkCongregation>To Be Confirmed</PublicTalkCongregation>
</PublicTalkInfo>
</W20230504>
<W20230504>
<PublicTalkInfo>
<MeetingDate>2023-05-07</MeetingDate>
<PublicTalkCongregation>To Be Confirmed</PublicTalkCongregation>
</PublicTalkInfo>
</W20230504>
<W20230504>
<PublicTalkInfo>
<MeetingDate>2023-05-07</MeetingDate>
<PublicTalkCongregation>To Be Confirmed</PublicTalkCongregation>
</PublicTalkInfo>
</W20230504>
</AssignmentHistory>
我知道这个 XML 设计得很糟糕(
WYYYYMMDD
节点都具有不同的名称),但这是我必须使用的数据文件。我可以使用 LINQ to XML 从此 XML 获取一组记录吗?
例如,
for(var cong : congs)
{
// 1. Select from history XML all records where PublicTalkCongregation is cong.Name.
// 2. Records must be date descending on MeetingDate.
// 3. We only want the records older than today.
}
换句话说,我可以使用 LINQ to XML 查找今天之前的
MeetingDate
(cong.Name
) 的最新日期 (PublicTalkCongregation
)。这样我就可以将 cong.LastInvited
更新到这个日期。
有道理吗?
我正在尝试建议的答案,但出现异常:
Unhandled Exception: System.ArgumentNullException: Value cannot be null.
Parameter name: element
at System.Xml.Linq.XElement.op_Explicit(XElement element)
at ConsoleApp1.Program.<>c.<Main>b__2_0(XElement x) in D:\My Programs\2022\Backup MSA2\ConsoleApp1\ConsoleApp1\Program.cs:line 24
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at ConsoleApp1.Program.Main(String[] args) in D:\My Programs\2022\Backup MSA2\ConsoleApp1\ConsoleApp1\Program.cs:line 23
我应该澄清,一些较旧的作业历史记录条目不会有
MeetingDate
\ PublicTalkCongregation
元素,在这种情况下,应该绕过这些历史周。
尝试以下操作:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Globalization;
namespace ConsoleApplication2
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement assignments = doc.Descendants("AssignmentHistory").FirstOrDefault();
List<Meeting> meetings = assignments.Elements().Select(x =>
new Meeting()
{
date = DateTime.ParseExact(x.Name.LocalName, "WyyyyMMdd", CultureInfo.InvariantCulture),
meetingDate = x.Descendants("MeetingDate").FirstOrDefault() == null ? new DateTime() : (DateTime)x.Descendants("MeetingDate").FirstOrDefault(),
congregation = (string)x.Descendants("PublicTalkCongregation").FirstOrDefault()
}).ToList();
}
}
}
public class Meeting
{
public DateTime date { get; set; }
public DateTime meetingDate { get; set; }
public string congregation { get; set; }
}