XML 数据过滤和搜索
XML data filtering and searching
我可以轻松生成以下 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>
我该如何实现?请帮忙
您目前正在 return 使用这些值对具有 date
和 time
属性的 Element
进行编辑。你应该添加到它的是 return 它的 Folder
的子元素。您可以通过在 .Where
.
之后添加 .Elements("Folder")
来完成此操作
但是,我认为您可以将查询写得更好一些:
寻找所有 session
这些属性的值等于给定输入。然后 return 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();
(看来我有点晚了,但是..)在某些情况下,使用 Xpath 比 Linq[=15= 更容易].
var folders = XDocument.Load(filename)
.XPathSelectElements("//session[@date='14.10.2016' and @time='15:40']/Folder");
我可以轻松生成以下 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>
我该如何实现?请帮忙
您目前正在 return 使用这些值对具有 date
和 time
属性的 Element
进行编辑。你应该添加到它的是 return 它的 Folder
的子元素。您可以通过在 .Where
.
.Elements("Folder")
来完成此操作
但是,我认为您可以将查询写得更好一些:
寻找所有 session
这些属性的值等于给定输入。然后 return 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();
(看来我有点晚了,但是..)在某些情况下,使用 Xpath 比 Linq[=15= 更容易].
var folders = XDocument.Load(filename)
.XPathSelectElements("//session[@date='14.10.2016' and @time='15:40']/Folder");