我可以使用 LINQ to XML 从此 XML 文件中提取所需的日期信息吗?

问题描述 投票:0回答:1

这可以通过 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
元素,在这种情况下,应该绕过这些历史周。

c# xml linq-to-xml
1个回答
0
投票

尝试以下操作:

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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.