Linq to XML选择子列表

时间:2011-12-01 18:40:09

标签: c# xml linq linq-to-xml

示例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();

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

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

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

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

3 个答案:

答案 0 :(得分:1)

您的behaviorlist现在不是一个列表 - 您希望元素不是组合文本,因此您应该检索{{1}而不是使用父节点的Value属性。 }名称为“behavior”:

Elements

然后,您可以从结果列表中轻松检索属性:

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

答案 1 :(得分:1)

idversionbehavior节点的属性:

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();

答案 2 :(得分: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个匿名对象{behavior,id,version}