首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XML数据过滤与检索

XML数据过滤与检索
EN

Stack Overflow用户
提问于 2016-10-23 18:15:26
回答 2查看 47关注 0票数 1

我有以下可以轻松生成的XML代码块。

代码语言:javascript
运行
复制
<?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的数据

代码语言:javascript
运行
复制
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)));
}

正在执行的函数如下:

代码语言:javascript
运行
复制
foreach (XElement x in FindElements(pathToXml, "14.10.2016", "15:40"))
    Console.WriteLine(x.ToString());

一切都很好,但是输出

代码语言:javascript
运行
复制
<session date="14.10.2016" time="15:40" amount="7">
    <Folder>C:\Users</Folder>
    <Folder>C:\Tes2taaaa</Folder>
    <Folder>C:\Asgbsf\Aleksei</Folder>
</session>

我只需要文件夹,如。

代码语言:javascript
运行
复制
<Folder>C:\Users</Folder>
<Folder>C:\Tes2taaaa</Folder>
<Folder>C:\Asgbsf\Aleksei</Folder>

我怎样才能做到这一点?请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-23 18:26:19

您目前正在返回具有这些值的Element属性为datetime。您应该添加的是返回它的Folder子元素。您可以通过在.Elements("Folder")之后添加.Where来实现这一点。

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

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

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

代码语言:javascript
运行
复制
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();
票数 0
EN

Stack Overflow用户

发布于 2016-10-23 18:50:34

(看来我有点晚了,但是..)在这种情况下,使用Xpath比使用Linq更容易。

代码语言:javascript
运行
复制
var folders = XDocument.Load(filename)
           .XPathSelectElements("//session[@dat‌​e='14.10.2016' and @time='15:40']/Folder");
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40206294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档