Linq to XML查询在返回单个实体时起作用,但需要是list <t> </t>

时间:2011-01-06 20:43:03

标签: xml linq linq-to-xml

鉴于此XML:

<foo>
   <xxx>Some XXX</xxx>
   <bar Attr1="true">Some Bar</bar>     
   <bar Attr2="true">Some Bar #2</bar>
   <bar>Some Bar #3</bar>
   <bar>Some Bar #4</bar>
</foo>

我有这个LINQ查询:

var foos = from query in xmlData.Descendants("foo")
       from bars in query.Elements("bar")
       select new FooClass
       {
    xxx = (string)query.Element("xxx"),
    barCollection = new BarClass
    {
        display = bars.Value,
        attr1Exists = (answers.Attribute("Attr1") != null ? true : false)
        attr2Exists = (answers.Attribute("Attr2") != null ? true : false)
        }
       };

如果将barCollection定义为BarClass,则此方法很有用。

但我需要它是List&lt; BarClass&gt;。

我已尝试过其他方法,如果bar是List&lt; string&gt;,则可以使用此方法:

var foos = from query in xmlData.Descendants("foo") 
select new FooClass 
{ 
    xxx = (string)query.Element("xxx"), 
    bar = query.Elements("bar").Select(x => x.Value).ToList() 
};

但我找不到混合两者的方法。

有人可以展示如何组合这两个解决方案,以便将BarCollection填充为用户定义的类型,即List&lt; BarClass&gt;?

更新:下面的最终工作代码,使用提供的解决方案

var foos = from query in xmlData.Descendants("foo") 
select new FooClass 
{ 
    xxx = (string)query.Element("xxx"), 
    bar = query.Elements("bar").Select(x => new BarClass
    {
        display = x.Value,
        attr1Exists = x("Attr1") != null ? true : false),
        attr2Exists = x("Attr2") != null ? true : false)
        }

    ).ToList() 
};

2 个答案:

答案 0 :(得分:0)

.Select(x => x.Value)更改为.Select(x => new BarClass(...))

答案 1 :(得分:0)

所以......稍微改写一下你的问题......

你想要一个将BarClasses集合作为其属性之一的Foo类吗?

List<BarClass> mybars = Foo.Bars; // is this your aim?

如果这是正确的,那么你不需要选择多个(你的第二个子句)

你会做一些几乎与你的第二种方法完全相同的事情......

  var foos = from query in xmlData.Descendants("foo")      
  select new FooClass
  {          
       xxx = (string)query.Element("xxx"), 
       Bars = query.Elements("bar").Select(x => new BarClass()
          {
             Attr1 = .. /// etc
             Attr2 = ....
          }).ToList();
  }