这是我的XML文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<categories>
<category1 name="Music">
<file>tabla.txt</file>
<file>sitar.txt</file>
</category1>
<category2 name="Documents">
<file>OCD1.txt</file>
<file>OCD2.txt</file>
</category2>
<category3 name="Movies">
<file>Thisistheend.txt</file>
<file>TheInternship.txt</file>
</category3>
</categories>
我使用以下查询来获取标记值:
q = from x in doc.Descendants() where (x.Attributes().Count()>0
&& (x.Attribute("name").Value == key) select x;
但<File>
标记值会被追加。当我尝试为每个显示值时,例如:“Documents”的<file>
标记值在ListView框中显示为“OCD1.txtOcd2.txt”。如何在LINQ查询中分离这两个值?
答案 0 :(得分:2)
您可以使用SelectMany
查询获取文件内容。在查询语法中,您可以通过在匹配类别上添加额外的/ select查询来实现此目的。
var query = from x in doc.Descendants()
where (string)x.Attribute("name") == key
from file in x.Elements("file")
select file.Value;
另请注意,我更新了过滤以直接检查name
属性。您可以避免检查属性计数。这是不必要的,并不保证name
属性的存在。如果您正在尝试防范缺少的name
属性,则可以转换该属性,如果该属性不存在,将返回null
。我使用这段代码完成了这项工作:(string)x.Attribute("name") == key
答案 1 :(得分:1)
对LINQ查询使用Lambda Expression方法,这也可以满足您的需求。
var q = doc.Descendants()
.Where(x => (string)x.Attribute("name") == key)
.SelectMany(x => x.Elements("file"))
.Select(x => x.Value);