2017-07-07 72 views
2

我想学习如何在C#中用XML保存和提取数据,即使我已经阅读了关于这里的类似问题的各种答案,但我无法获得保留为什么我的陈述没有任何回报。 我正在编写的程序只是一个测试,其中我已经在xml文档中保存了关于几部电影的数据,现在我试图根据它们的成本检索其中的一些。用linq搜索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> 

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

+3

您需要调试代码。另外,'var movies = from _xdoc.Root.Elements(“Name”)中的影片会选择(可能 - 它可能不会返回任何内容,但如果是的话......)所有元素。然后,您尝试通过'movie.Element(“Cost”)检索成本,但元素*没有任何子元素!! *至少需要将其更改为_xdoc.Root.Elements (“电影”)'并在末尾做一个'select movie.Elements(“Name”)'或类似的名字,以获得匹配的所有电影名称。 – Will

+0

谢谢,我显然已经把那个linq查询中的元素名称混淆了一下。感谢您的帮助:) – sunero4

回答

4

根元素包含Movie元素:

var movies = from movie in _xdoc.Root.Elements("Movie") // here instead of "Name" 
      where (double)movie.Element("Cost") < cost 
      select movie; 

此外,XElement支持显式铸造翻番。你可以替换LINQ查询的第二环(假设你要选择的电影名):

List<string> list = movies.Select(m => (string)m.Element("Name")).ToList(); 
+1

非常感谢,解决了我的问题! – sunero4

+0

你太善良了,不会花时间回答这个问题。 –

1

用简单的英语,你似乎在试图找到电影超过900(有些武断货币)更便宜。

你可以写为:

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(); 
} 
+0

哈哈呀,确切地说 - 在实际应用中,货币和其他东西当然会被指定,但这仅仅是为了获得xml的挂起。我真的得到它不仅与名称工作,但与返回一个MovieDTO的列表,而不是: (哎呀,代码格式不工作在评论:D但是,是的,它现在的工作原理!感谢您的帮助:) !) – sunero4