0

尝试将 XDocument 转换为对象列表时遇到问题,尤其是 Categories 元素。以下是 XML 的片段,它返回以下格式的节目列表。

<Show>
  <Name>OLYMPIC GAMES</Name>
  <Artist>OLYMPIC GAMES</Artist>
  <OnSale>false</OnSale>
  <DateOnSale>2011-03-11T00:00:00</DateOnSale>
  <DoorsOpen>2012-12-31T10:00:00</DoorsOpen>
  <Starts>2012-12-31T10:00:00</Starts>
  <BespokeDate>25 July 2012 - 12 August 2012</BespokeDate>
  <Status Code="3">SOLD OUT</Status>
  <Categories>
    <Category Id="190">OTHER</Category>
  </Categories>
  <Prices>
    <Price Type="1">
      <Status Code="24">ORDER</Status>
      <FaceValue>0.00</FaceValue>
      <BookingFee>0.00</BookingFee>
      <TicketPrice>0.00</TicketPrice>
      <Description>UNRESERVED</Description>
    </Price>
  </Prices>
  <Venue Uri="/venues/">
    <Name>Various venues</Name>
    <Town></Town>
  </Venue>
</Show>

下面是我创建的用于建模 XML 数据的类

public class Show {
  public string Name { get; set; }
  public string Artist { get; set; }
  public bool OnSale { get; set; }
  public DateTime DateOnSale { get; set; }
  public DateTime DoorsOpen { get; set; }
  public DateTime Starts { get; set; }
  public string BespokeDate { get; set; }
  public Status Status { get; set; }
  public IEnumerable<Category> Categories { get; set; }
  public Venue Venue { get; set; }
}

public class Status
{
  public int Code { get; set; }
  public string Description { get; set; }
}

public class Category
{
  public int Id { get; set; }
  public string Name { get; set; }
}

public class Venue
{
  public string Uri { get; set; }
  public string Name { get; set; }
  public string Town { get; set; }
}

下面是用于创建 Show 对象的 Linq to XML

var shows = from s in xdoc.Descendants("Show")
  where 
    s.Element("OnSale").Value.AsBool() != false
  select
    new Show {
      Name = s.Element("Name").Value,
      Artist = s.Element("Artist").Value,
      OnSale = s.Element("Name").Value.AsBool(),
      DateOnSale = s.Element("DateOnSale").Value.AsDateTime(),
      DoorsOpen = s.Element("DoorsOpen").Value.AsDateTime(),
      Starts = s.Element("Starts").Value.AsDateTime(),
      BespokeDate = s.Element("BespokeDate").Value,
      Status = new Status { 
        Code = s.Element("Status").Attribute("Code").Value.AsInt(),
        Description = s.Element("Status").Value
      },
      Categories = (from c in s.Element("Categories").Elements("Category")
        select new Category { 
            Id = s.Attribute("Id").Value.AsInt(),
            Name = s.Value
          }),
      Venue = new Venue {
        Name = s.Element("Venue").Element("Name").Value,
        Town = s.Element("Venue").Element("Town").Value
      }
};

下面是显示 Show 的代码片段

foreach(var show in shows)
{
  <p>
    Name: @show.Name | 
    Status: @show.Status.Description | 
    Venue: @show.Venue.Name | 
    Categories: @string.Join(",", show.Categories.Select(x => x.Name))
  </p>
}

每当尝试显示类别时,都会出现以下错误“对象引用未设置为对象的实例”。据我所知,每个节目都有一个或多个类别。

有任何想法吗?

4

1 回答 1

0

这就是问题:

  Categories = (from c in s.Element("Categories").Elements("Category")
    select new Category { 
        Id = s.Attribute("Id").Value.AsInt(),
        Name = s.Value
      }),

您正在使用s.Attributeands.Value而不是c.Attributeand c.Value

我还建议使用显式转换来int代替Value.AsInt()

  Categories = (from c in s.Element("Categories").Elements("Category")
    select new Category { 
        Id = (int) c.Attribute("Id"),
        Name = (string) c.Value
      }),
于 2012-05-17T10:03:34.623 回答