2017-07-07 19 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> 

私はこれが私を助けてくれるのに十分な情報であり、ありがとうございます。

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

また、XElementが倍増する明示的なキャストをサポートしています:)

+3

。また、 'var movies = _xdoc.Root.Elements(" Name ")のムービーから、すべての要素を選択します(おそらく何も返しませんが、そうであれば...)。次に、movie.Element( "Cost")でコストを取得しようとしますが、要素には子要素がありません!! *少なくとも、それを '_xdoc.Root.Elements 'に変更する必要があります最後に映画(「映画」)を選択し、「映画を選択する.Elements(「名前」)」などを使用して、一致する映画のすべての名前を取得する。 – Will

+0

ありがとう、私は明らかにそのlinqクエリで少し混在している要素名を得ていた。助けをありがとう:) – sunero4

答えて

4

ルート要素はMovie要素が含まれています。そして、あなたはLINQクエリ(あなたが映画の名前を選択したいと仮定)と第二のループを置き換えることができます。平易な英語で

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

ありがとう、私の問題を解決した! – sunero4

+0

あなたは時間がかかりすぎてその質問に答えるのは親切です。 –

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

まあまあ、実際の生活アプリでは、通貨やその他のものはもちろん特定されますが、これは単なるXMLのハングを取得するためのものです。 (コードの書式設定はコメントでは機能しません:Dしかし、確かにそれは意図した通りです!)ありがとうございました:) !) – sunero4