使用linq搜索Xml文档不会返回任何内容

时间:2017-07-07 19:34:44

标签: c# xml linq

我试图学习如何使用C#中的XML保存和提取数据,尽管我已经在这里阅读了类似问题的各种答案,但我无法理解为什么我的陈述不是&#返回任何东西。 我写的程序只是一个测试,我在xml文档中保存了几部电影的数据,现在我试图根据它们的成本检索其中的一些。

这是我为搜索而写的课程:

 class ExtractData
{
    private XDocument _xdoc;
    public List<string> SearchByCost(double cost)
    {
        _xdoc = XDocument.Load(FileLocation.XmlFileLocation);
        List<string> list = new List<string>();

        var movies = from movie in _xdoc.Root.Elements("Name")
                where Convert.ToDouble(movie.Element("Cost").Value) < cost
                select movie;

        foreach (var item in movies)
        {
            list.Add(item.Value);
        }

        return list;
    }

}

这就是我试图让它在控制台中打印出来的方式:

        eData = new ExtractData();
        foreach (var movie in eData.SearchByCost(9))
        {
            Console.WriteLine(movie);
        }

这是XML文档的内容:

<?xml version="1.0" encoding="utf-8"?>
<Movies>
  <Movie>
    <Id>1</Id>
    <Name>Shawshank Redemption</Name>
    <Director>Frank Darabont</Director>
    <Year>1994</Year>
    <Cost>9.95</Cost>
  </Movie>
  <Movie>
    <Id>2</Id>
    <Name>Pulp Fiction</Name>
    <Director>Quentin Tarantino</Director>
    <Year>1995</Year>
    <Cost>8.95</Cost>
  </Movie>
  <Movie>
    <Id>3</Id>
    <Name>Sharknado</Name>
    <Director>Anthony Ferrante</Director>
    <Year>2013</Year>
    <Cost>5.95</Cost>
  </Movie>
</Movies>

我希望这是足够的信息来帮助我,并提前感谢! :)

2 个答案:

答案 0 :(得分:4)

根元素包含CustomEachWriter个元素:

Movie

此外,var movies = from movie in _xdoc.Root.Elements("Movie") // here instead of "Name" where (double)movie.Element("Cost") < cost select movie; 支持显式转换为double。您可以使用LINQ查询替换第二个循环(假设您要选择电影的名称):

XElement

答案 1 :(得分:1)

用简单的英语,你似乎试图找到比9(某种任意货币)便宜的电影。

您可以将其写为:

public IReadOnlyCollection<string> SearchByCost(XDocument xdoc, double cost) 
{
    return xdoc.Root.Elements("Movie")
        .Where(movie => (double)movie.Element("Cost") < cost)
        .Select(movie => movie.Element("Name").Value)
        .ToList();
}