分别以XML格式获取标记值

时间:2013-11-09 04:32:35

标签: c# linq linq-to-xml

这是我的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查询中分离这两个值?

2 个答案:

答案 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);