使用LINQ获取XDocument的详细信息

本文关键字:详细信息 XDocument 获取 LINQ 使用 | 更新日期: 2023-09-27 18:06:03

我有以下XDocument

<results>
<team id="1" name="Manchester United">
    <player name="Ryan Giggs" position="midfielder" />
    <player name="Wayne Rooney" position="striker" />
    <player name="Rio Ferdinand" position="defender" />
</team>
<team id="2" name="Liverpool">
    <player name="Steven Gerrard" position="midfielder" />
    <player name="Luis Suarez" position="striker" />
    <player name="John Terry" position="defender" />
</team>
<team id="1" name="Manchester City">
    <player name="Kolo Toure" position="midfielder" />
    <player name="Samuel Eto" position="striker" />
    <player name="Vincent Company" position="defender" />
</team>
</results>

,我希望得到所有的数据如下

IEnumerable<Teams> (TeamID and TeamName)
IEnumerable<PLayers> (TeamID, PlayerName, Position)

现在我有下面的

XElement results = doc.Root.Element("results");
var teams =
    (from p in results.Descendants("team")
     select new
     {
         Id = utils.GetDecimal(p.Element("id").Value),
         TeamName = p.Element("name")
     }).ToList();

但是这会抛出一个错误。

那么我的想法是对每个球队做同样的事情,得到球队的球员。

我哪里错了?

使用LINQ获取XDocument的详细信息

  1. id不是元素,它是一个属性
  2. 你不应该使用Value属性,如果没有找到元素,它会抛出异常,而是使用显式强制转换。
  3. 也为你的球队和球员创建一个类,而不是创建匿名类型。

    var teams = (from p in results.Descendants("team")
                     select new
                     {
                         Id = utils.GetDecimal((string)p.Attribute("id")),
                         TeamName = (string)p.Element("name"),
                         Players = p.Elements("player")
                         .Select(x => new
                         {
                             Name = (string)x.Attribute("name"),
                             Position = (string)x.Attribute("position")
                         })
                         .ToList()
                     }).ToList();