2011-12-01 84 views
0

一个例子XML文件是这样的:的LINQ to XML选择孩子列出

<?xml version="1.0" encoding="UTF-8"?> 
<game> 
    <name>bomber</name> 
    <behaviors-used> 
     <behavior id="Bullet" version="1">Bullet</behavior> 
     <behavior id="Fade" version="1">Fade</behavior> 
     <behavior id="Flash" version="1">Flash</behavior> 
     <behavior id="Sin" version="1">Sine</behavior> 
     <behavior id="scrollto" version="1">Scroll To</behavior> 
    </behaviors-used> 
</game> 

我有查询:

var data = (from item in loaded.Descendants("game") 
      select new 
      { 
       name = item.Element("name").Value, 
       behaviorlist = item.Element("behaviors-used").Value 
      }).Single(); 

这似乎很好地工作。但是,我现在需要检索behaviorlist中的所有<behavior>元素。我似乎无法这样做:

var bq = (from c in data.behaviorlist select new { behaviour = c.Element("behaviour")}); 

(引发无效的语法错误)。

如何检索所有行为,并且不仅可以访问其文本,还可以检查属性idversion

回答

1

behaviorlist是不是一个真正的名单,现在 - 你想要的元素不是合并文本左右,而不是使用父节点的Value属性,则应检索Elements名称为“行为”:

var data = (from item in loaded.Descendants("game") 
      select new 
      { 
       name = item.Element("name").Value, 
       behaviorlist = item.Element("behaviors-used").Elements("behavior") 
      }).Single(); 

从结果列表中,你可以很容易得到这些属性:

var bq = (from c in data.behaviorlist select new 
{ 
    id = c.Attribute("id").Value, 
    version = c.Attribute("version").Value, 
}); 
1

idversion是属性节点:

var items = 
    xDocument.Descendants("behaviors-used") 
      .Descendants("behavior") 
      .Select((w, i) => 
       new 
        { 
         Index = i, 
         Value = w.Value, 
         Id = w.Attribute("id").Value, 
         Version = w.Attribute("version").Value 
        }) 
      .ToList(); 
1

之所以能够得到这个LinqPad工作与您的文档:

var data = (from item in loaded.DescendantsAndSelf("game") 
      select new{ 
         name = item.Element("name").Value, 
         behaviorlist = item.Element("behaviours-used") 
         } 
      ).Single(); 

    var bq = (from c in data.behaviorlist.Descendants("behaviour") 
      select new { 
         behaviour = c.Value, 
         id = c.Attribute("id").Value, 
         version = c.Attribute("version").Value 
         }); 

,并取得了5个匿名对象{行为,ID,版本}

序列