XML数据过滤和搜索

时间:2016-10-23 18:15:27

标签: c# xml linq linq-to-xml

我有以下很容易生成的XML代码。

<?xml version="1.0" encoding="utf-8"?>
<sessions>
  <session date="14.10.2016" time="0:1" amount="1">
    <Folder>C:\Users</Folder>
    <Folder>C:\Tes2t</Folder>
    <Folder>C:\Asgbsf\Aleksei</Folder>
  </session>
  <session date="14.10.2016" time="15:40" amount="7">
    <Folder>C:\Users</Folder>
    <Folder>C:\Tes2taaaa</Folder>
    <Folder>C:\Asgbsf\Aleksei</Folder>
  </session>
</sessions>

我正在使用以下功能

搜索属性时间为15:40和日期为14.10.2016的数据
private static IEnumerable<XElement> FindElements(string filename, string date, string time)
{
    XElement x = XElement.Load(filename);

    return x.Descendants().Where(e => e.Attributes("date").Any(a => a.Value.Equals(date)) &&
    e.Attributes("time").Any(a => a.Value.Equals(time)));
}

正在执行的功能如下:

foreach (XElement x in FindElements(pathToXml, "14.10.2016", "15:40"))
    Console.WriteLine(x.ToString());

一切都很好,但输出是

<session date="14.10.2016" time="15:40" amount="7">
    <Folder>C:\Users</Folder>
    <Folder>C:\Tes2taaaa</Folder>
    <Folder>C:\Asgbsf\Aleksei</Folder>
</session>

我只需要文件夹,例如。

<Folder>C:\Users</Folder>
<Folder>C:\Tes2taaaa</Folder>
<Folder>C:\Asgbsf\Aleksei</Folder>

我如何实现这一目标?请帮助。

2 个答案:

答案 0 :(得分:4)

(看起来我有点迟了,但是......)在某些情况下使用 Xpath Linq 更容易。

var folders = XDocument.Load(filename)
           .XPathSelectElements("//session[@dat‌​e='14.10.2016' and @time='15:40']/Folder");

答案 1 :(得分:0)

您目前正在使用这些值返回属性为Elementdate的{​​{1}}。你要添加的是返回time的子元素。您可以在Folder之后添加.Elements("Folder")

但是,我认为您可以更好地编写查询:

查找那些attriute的值等于给定输入的所有.Where s。然后返回session

我已添加element.Elements("Folder")以展平子元素的内部列表

.SelectMany()