C# 使用LINQ到XML访问值

C# 使用LINQ到XML访问值,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我正在研究由另一个应用程序自动生成的XML格式,我想使用Linq to XML遍历XML,但我不确定如何获得所需的值 以下是XML的一个片段: <dict> <key>Major Version</key><integer>1</integer> <key>Tracks</key> <dict> <key>3620</key> <dict>

我正在研究由另一个应用程序自动生成的XML格式,我想使用Linq to 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>
由于
键的实际值存储为同级节点,因此我使用
NextNode
访问这些节点

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


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

使用
ElementsAfterSelf.First()
可以转到下一个元素。这段代码假设会有另一个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);

这是一种非常糟糕的XML格式。当两个值属于一起时,不应该仅仅通过它们相邻来表示。不幸的是,XML格式将保留(因为它实际上来自iTunes XML库),并且无法更改它。相反,我使用XSL文件将XML从其当前形式转换为更友好的XML格式,该格式可由.NET中的
XElement
读取。然后是一个简单的Linq到XML查询,以过滤出我需要的项。如果有人需要,我这里有XSL。它将XML转换为HTML格式,但我修改了XSL,以便我的应用程序能够正确使用它。
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);