我正在研究由另一个应用程序自动生成的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.Any
和ran.Select
,但我不确定要使用哪个lambda表达式。或者我应该在原始ran
查询中附加我的过滤器吗?
答案 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);