2

这是我的 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>标签值正在附加。当我尝试使用 for each 显示值时,例如:<file>“文档”的标记值在 ListView 框中显示为“OCD1.txtOcd2.txt”。如何在我的 LINQ 查询中分离这两个值?

4

2 回答 2

2

您可以使用SelectMany查询来获取文件内容。在查询语法中,您可以通过在匹配类别上添加额外的 from/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

于 2013-11-09T05:05:41.167 回答
1

对 LINQ 查询使用 Lambda 表达式方法也可以满足您的需求。

var q = doc.Descendants()
           .Where(x => (string)x.Attribute("name") == key)
           .SelectMany(x => x.Elements("file"))
           .Select(x => x.Value);
于 2013-11-09T05:28:52.017 回答