使用LINQ to XML访问值

时间:2014-06-08 00:55:32

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

我正在研究由另一个应用程序自动生成的XML格式,我想使用Linq遍历XML到XML,但我不确定如何获取我需要的值。

以下是XML的摘录:

<dict>
<key>Major Version</key><integer>1</integer>    
<key>Tracks</key>
<dict>
    <key>3620</key>
    <dict>
        <key>Track ID</key><integer>3620</integer>
        <key>Name</key><string>Ran</string>
        <key>Age</key><integer>22</integer>         
    </dict>
    <key>3622</key>
    <dict>
        <key>Track ID</key><integer>3622</integer>
        <key>Name</key><string>Jardine</string>
        <key>Age</key><integer>24</integer>         
    </dict>

如您所见,dict在内部重复,键和值由各个节点分隔。我需要让dict个节点的密钥age大于某个值(或者基本上,我需要按dict下的值进行过滤)

以下是我将所有Age值作为列表获取的内容:

        var ran = x.Root.Elements("dict")
                    .Elements("dict")
                    .Elements("dict")
                    .Select(r =>
                        r.Descendants("key")
                        .Where(w => w.Value == "Age")
                        .Select(s => (XElement)
                            s.NextNode
                            )
                    ).ToList();

由于Key的实际值存储为兄弟节点,因此我使用NextNode访问它们。

然而,这就是问题所在。如何根据条件过滤变量XElements中的ran,例如大于某个值?

我尝试了ran.Anyran.Select,但我不确定要使用哪个lambda表达式。或者我应该在原始ran查询中附加我的过滤器吗?

1 个答案:

答案 0 :(得分:2)

使用ElementsAfterSelf.First(),您可以转到下一个XElement。这段代码做了很多假设,即会有另一个XElement,它将是整数元素,值将是一个int。您需要确定您信任的程度,其他系统总是以这种格式向您发送XML,或者您需要编写一些防御性代码。

var age = 23;

var ran = xdoc.Root.Elements("dict")
              .Elements("dict")
              .Elements("dict")
              .Elements("key")
              .Where(x => (string) x == "Age" && (int) x.ElementsAfterSelf.First() > age)
              .Select(x=>x.Parent);