【问题标题】:XML data filtering and searchingXML 数据过滤和搜索
【发布时间】:2016-10-23 18:15:26
【问题描述】:

我有以下可以轻松生成的 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>

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

【问题讨论】:

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


    【解决方案1】:

    (似乎我来晚了一点,但是..)在某些情况下,使用 Xpath 比 Linq 更容易。

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

    【讨论】:

    • 同意 :) 没想到
    【解决方案2】:

    您当前正在返回具有date 和time 属性的Element 以及这些值。您应该添加的是返回其Folder 的子元素。您可以通过在.Where 之后添加.Elements("Folder") 来做到这一点。

    但是,我认为您可以将查询写得更好一点:

    查找所有sessions,这些属性的值等于给定的输入。然后返回element.Elements("Folder")。

    我添加了 .SelectMany() 来展平子元素的内部列表

    string date = "14.10.2016";
    string time = "15:40";
    
    var result = (from element in XDocument.Load("data.xml").Descendants("session")
                  where element.Attribute("date")?.Value == date &&
                        element.Attribute("time")?.Value == time
                  select element.Elements("Folder")).SelectMany(item => item).ToList();
    

    【讨论】:

    • 完美运行。非常感谢,也感谢您的解释,这很有帮助!
    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多