使用linq对xml进行排序,但得到一个null错误
本文关键字:错误 null 一个 xml linq 排序 使用 | 更新日期: 2024-09-19 03:40:19
正在尝试根据时间字段对xml文件进行排序(首先排序)。。。xml的一个片段如下:(我想订购的元素是TimeEventStart)
<Bookings>
<Data>
<BookingDate>2015-03-02T00:00:00</BookingDate>
<StartBookingDate>2015-03-02T00:00:00</StartBookingDate>
<RoomDescription>The room</RoomDescription>
<TimeEventStart>6:00 PM</TimeEventStart>
<TimeEventEnd>2015-03-02T20:00:00</TimeEventEnd>
<GroupName>Group Council</GroupName>
<EventName>Some cool event</EventName>
<SetupTypeDescription>SPECIAL</SetupTypeDescription>
<SetupCount>30</SetupCount>
<ReservationID>64352</ReservationID>
<EventCoordinator>ERS</EventCoordinator>
<GroupID>124151</GroupID>
<VIP xml:space="preserve"> </VIP>
<VIPEvent>false</VIPEvent>
<ClosedAllDay>false</ClosedAllDay>
....
</Data>
<Data>
.... more like above ...
</Data>
</Bookings>
首先,我用之前的答案作为指南:
static void SortFeed(String resMain)
{
XDocument xmlSorted = XDocument.Parse(resMain);
foreach (var trans in xmlSorted.Descendants("Data"))
{
trans.ReplaceAll(trans.Elements().OrderBy(x => DateTime.Parse(x.Element("TimeEventStart").Value)).ToArray());
}
string newXml = xmlSorted.ToString();
Console.WriteLine("Done:");
Console.WriteLine(newXml);
}
这会运行,但在中出现错误
DateTime.Parse(x.Element("TimeEventStart").Value)
错误为未处理的nullreference异常。
我想我知道发生了什么,它想在TimeEventStart上排序,但却发现了其他东西,我认为如果它找到了它,它只会根据该元素排序,我一定错了。由于没有使用Linq的经验(而且显然是在处理xml文件),我很好奇我缺少了什么部分,或者我是否在错误的区域开始了解析?(.冗余?)
您进入的层次太深了-trans
已经是Data
元素,然后在Data
中对元素进行排序。。。通过这些子元素中的每一个子元素内的CCD_ 4元素。。。而这并不存在,因为TimeEventStart
是Data
中的直接元素。我怀疑你想去掉你的foreach
循环:
var doc = XDocument.Parse(resMain);
var root = xmlSorted.Root;
var sortedData = root.Elements
.OrderBy(data => DateTime.Parse(data.Element("DateTimeStart").Value))
.ToArray();
root.ReplaceAll(sortedData);
然而,由于DateTimeStart
的值,您可能仍然有问题-您只有6:00 PM
,在我看来它不像日期/时间。DateTimeEnd
的值看起来像一个合适的ISO-8601日期/时间。。。实际上,您可以将这样的XElement
强制转换为DateTime
,例如
var sortedData = root.Elements
.OrderBy(data => (DateTime) data.Element("DateTimeEnd"))
.ToArray();
但这显然是到最后点餐,而不是从开始点餐。如果这真的是你的数据的样子,并且你真的想按它排序,你需要考虑一下它的实际含义,因为它不是日期和时间。