使用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文件),我很好奇我缺少了什么部分,或者我是否在错误的区域开始了解析?(.冗余?)

使用linq对xml进行排序,但得到一个null错误

您进入的层次太深了-trans已经是Data元素,然后在Data中对元素进行排序。。。通过这些子元素中的每一个子元素内的CCD_ 4元素。。。而这并不存在,因为TimeEventStartData中的直接元素。我怀疑你想去掉你的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();

但这显然是到最后点餐,而不是从开始点餐。如果这真的是你的数据的样子,并且你真的想按它排序,你需要考虑一下它的实际含义,因为它不是日期和时间。