You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C# Linq将XML数据映射到ApptDetails对象?

问题修正方案

首先修正ApptDetails类(恢复date属性)

class ApptDetails
{
    public string date { get; set; } // 取消注释,用来存储<date>节点里的日期文本
    public string starttime { get; set; }
    public string endtime { get; set; }
    public string details { get; set; }
    public string notes { get; set; }
}

错误点说明

  1. 遍历节点错误:XML中每个预约数据都包裹在<date>节点下,应该遍历<date>节点而非<starttime>节点
  2. 取值方式错误:starttime/endtime等是<date>的子元素,不是节点属性,不能用Attribute()方法,需用Element()获取子元素后读取其值
  3. 对象关联错误:你创建的apptDetails是空实例,和Linq查询出的result没有关联,弹窗自然无法显示数据
  4. 日期值未提取:<date>节点内的文本就是日期,需要去除空白后赋值

修正后的完整代码

if (File.Exists(@"C:\FSAppointmentsTest\Appointments\" + now.ToString("MMMM") + ".xml"))
{
    XDocument appointments = XDocument.Load(@"C:\FSAppointmentsTest\Appointments\" + now.ToString("MMMM") + ".xml");

    // 遍历所有<date>节点,映射为ApptDetails集合
    IEnumerable<ApptDetails> apptList = from dateNode in appointments.Root.Descendants("date")
                                        select new ApptDetails()
                                        {
                                            // 提取<date>节点内的日期文本,去除前后空白和换行干扰
                                            date = dateNode.Nodes().OfType<XText>().First().Value.Trim(),
                                            // 获取子元素的值,空值运算符避免空引用异常
                                            starttime = dateNode.Element("starttime")?.Value.Trim(),
                                            endtime = dateNode.Element("endtime")?.Value.Trim(),
                                            details = dateNode.Element("details")?.Value.Trim(),
                                            notes = dateNode.Element("notes")?.Value.Trim()
                                        };

    // 遍历集合测试每个预约数据
    foreach (var appt in apptList)
    {
        MessageBox.Show($"日期: {appt.date}\n开始时间: {appt.starttime}\n结束时间: {appt.endtime}\n详情: {appt.details}\n备注: {appt.notes}");
    }
}

补充说明

  • 使用dateNode.Nodes().OfType<XText>().First().Value.Trim()可以精准提取<date>节点内的日期文本,避免子元素文本干扰
  • ?.空值运算符能防止子元素不存在时触发空引用异常
  • 直接遍历映射后的apptList,每个元素都是完整的预约对象,无需单独创建空对象测试

内容的提问来源于stack exchange,提问作者Windwalker053

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:40