2

我有一个这样的xml:

<countries>
    <country ID="MX">
        <idea ID="Valor1">nota1</idea>
        <idea ID="Valor2">nota2</idea>
        <idea ID="Valor3">nota3</idea>
        <idea ID="Valor4">nota4</idea>
    </country>
    <country ID="US">
        <idea ID="Valor1">nota1</idea>
        <idea ID="Valor2">nota2</idea>
        <idea ID="Valor3">nota3</idea>
        <idea ID="Valor4">nota4</idea>
    </country>
</countries>

使用 LINQ to XML 如何获取特定类型的列表?我试过这样的事情:

我创建了一个类:

public class Ideas
{
    public string Country { get; set; }

    public List<ListItem> ListIdeas { get; set; }
}

然后我用这个类来做一个列表:

XDocument xdoc = XDocument.Load(this.Server.MapPath("~/config/ideas.xml"));

var cat = from p in xdoc.Descendants("countries")
                        .Elements("country")
                        .Select(m => new Ideas 
                            {
                                Country = m.Attribute("ID").Value, 
                                ListIdeas = m.Elements("idea")
                                             .Select(c => 
                                                 new ListItem 
                                                 {
                                                     Text = c.Attribute("ID").Value , 
                                                     Value = c.Value
                                                 }).ToList()
                            });

但我得到下一个错误:

查询主体必须以 select 子句或 group 子句结尾

select 子句中的表达式类型不正确。调用“选择”时类型推断失败。

4

2 回答 2

4

您混合使用查询语法和扩展方法语法。选择一个

var r = (from c in xdoc.Element("countries")
                       .Elements("country")
         select new Country
         {
             ID = c.Attribute("ID").Value,
             Ideas = (from i in c.Elements("idea")
                      select new Idea
                      {
                          Text = i.Attribute("ID").Value, 
                          Value = i.Value
                      }).ToList()
         }).ToList();

请注意,我重命名了您的类和属性以提高可读性。


在另一种语法中相同:

var q = xdoc.Element("countries")
            .Elements("country")
            .Select(c => new Country
                 {
                      ID = c.Attribute("ID").Value,
                      Ideas = c.Elements("idea")
                               .Select(i => new Idea
                                   {
                                       Text = i.Attribute("ID").Value, 
                                       Value = i.Value
                                   })
                               .ToList()
                 })
            .ToList();
于 2013-01-23T19:10:36.850 回答
1

你最后缺少选择。尝试:

XDocument xdoc = XDocument.Load(this.Server.MapPath("~/config/ideas.xml"));

List<Ideas> cat = from p in xdoc.Descendants("countries").Elements("country")
                         .Select(m => new Ideas 
                             {
                                 Country = m.Attribute("ID").Value, 
                                 ListIdeas = m.Elements("idea")
                                 .Select(c => 
                                     new ListItem 
                                     {
                                         Text = c.Attribute("ID").Value , 
                                         Value = c.Value
                                     }).ToList()
                             }) select p;
于 2013-01-23T19:09:55.323 回答