如何用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; } }
错误点说明
- 遍历节点错误:XML中每个预约数据都包裹在
<date>节点下,应该遍历<date>节点而非<starttime>节点 - 取值方式错误:
starttime/endtime等是<date>的子元素,不是节点属性,不能用Attribute()方法,需用Element()获取子元素后读取其值 - 对象关联错误:你创建的
apptDetails是空实例,和Linq查询出的result没有关联,弹窗自然无法显示数据 - 日期值未提取:
<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
相关产品推荐
相关产品推荐

