【发布时间】:2014-06-08 00:55:31
【问题描述】:
我正在研究由另一个应用程序自动生成的 XML 格式,我想使用 Linq to XML 遍历 XML,但我不知道如何获取我需要的值。
这是 XML 的 sn-p:
<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 访问那些。
但是,这就是问题所在。如何根据条件过滤变量ran中的XElements,比如大于某个值?
我尝试了ran.Any 和ran.Select,但我不确定要使用哪个 lambda 表达式。或者我应该在我原来的ran 查询中附加我的过滤器?
【问题讨论】:
-
这是一种非常糟糕的 XML 格式。当两个值属于一起时,不应仅通过它们彼此相邻来表示。
-
不幸的是,XML 格式仍然存在(因为它实际上来自 iTunes XML 库)并且无法更改。相反,我使用 XSL 文件将 XML 从其当前形式转换为可被 .NET 中的
XElement读取的更友好的 XML 格式。然后是一个简单的 Linq to XML 查询来过滤掉我需要的项目。如果有人需要,我在这里paraesthesia.com/archive/2004/06/14/… 获得了 XSL。它将 XML 转换为 HTML 格式,但我修改了 XSL,以便我的应用程序可以正确使用它。
标签: c# xml linq linq-to-xml