2009-06-16 8 views
0

私はLinqを使い慣れていて、どこでどこを使ってクエリを実行しようとすると何か奇妙な結果が出ます。 XMLのLinq to XML - 奇妙な結果

例:

<movies> 
     <movie id="1"> 
     <scenes> 
      <scene id="1"> 
      <sceneartistsnames> 
       <sceneartistname>Artist A</sceneartistname> 
      </sceneartistsnames> 
      </scene> 
      <scene id="2"> 
      <sceneartistsnames> 
       <sceneartistname>Artist B</sceneartistname> 
      </sceneartistsnames> 
      </scene> 
     </scenes> 
     </movie> 
     <movie id="10"> 
     <scenes> 
      <scene id="1"> 
      <sceneartistsnames> 
       <sceneartistname>Artist B</sceneartistname> 
       <sceneartistname>Artist A</sceneartistname> 
      </sceneartistsnames> 
      </scene> 
     </scenes> 
     </movie> 
    </movies> 

今すぐアーティストAがその一部であるすべてのシーンを選択しようとしています。

Dim Results = From MovieWithArtist In MoviesXML...<scene> _ 
       Where MovieWithArtist.<sceneartistsnames>.<sceneartistname>.Value = "Artist A" _ 
       Select MovieWithArtist 

私は1つのシーンリターンを取得し、私は2つを期待していました。私はXMLで2番目のシーンを変更した場合:(

は今:

<movie id="10"> 
     <scenes> 
      <scene id="1"> 
      <sceneartistsnames> 
       <sceneartistname>Artist A</sceneartistname> 
       <sceneartistname>Artist B</sceneartistname> 
      </sceneartistsnames> 
      </scene> 
     </scenes> 
     </movie> 

は、その後、私は2つのシーンが返す取得

私が間違っているのは何

はあなたにみんなありがとう。?。

+0

特定のアーティストの「映画」やその中の特定のアーティストの「シーン」を取得しようとしていますか? – orandov

+0

こんにちはorandov、その中に特定のアーティストがいる「シーン」を取得しようとしています。ありがとうございました。 –

答えて

0

まあ、私は怖いVB.NETのXML構文を知らないが、このC#が正常に動作します:

static void Main() 
{ 
    XDocument doc = XDocument.Load("movies.xml"); 

    var query = doc.Descendants("scene") 
        .Where(scene => scene.Elements("sceneartistsnames") 
             .Elements("sceneartistname") 
             .Any(name => name.Value == "Artist A")); 

    foreach (var scene in query) 
    { 
     Console.WriteLine(scene); 
    } 
} 

これをVB.NETのLINQ拡張メソッド呼び出しに変換するのは難しいことではありませんが、XML固有の構文を助けるために他の人が必要になるのではないかと心配です。私は別の答えとしてこれを掲示する書式設定の便宜上

+0

ありがとうジョン、私のC#のスキルは非常に貧しいですが、依然としてvb.netにあなたのソリューションを変換しようとします、ヘルプジョンのおかげです。 –

0

ジョンの答えの別の代替は、セレクト多く(のから複数)を使用することです

var qry = from x in xe.Descendants("scene") 
      from s in x.Descendants("sceneartistname") 
      where (string)s == "Artist A" 
      select string.Format("Movie ID {0} Scene ID {1} : {2}", (int)x.Parent.Parent.Attribute("id"), (int)x.Attribute("id"), (string)s); 
+0

ありがとう私もこの方法でテストする必要があります。 –

1

これはジョンの答えはに変換されVB.Netを使用してthis site

Private Shared Sub Main() 
    Dim doc As XDocument = XDocument.Load("movies.xml") 

    Dim query = doc.Descendants("scene").Where(Function(scene) scene.Elements("sceneartistsnames").Elements("sceneartistname").Any(Function(name) name.Value = "Artist A")) 

    For Each scene In query 
     Console.WriteLine(scene) 
    Next 
    End Sub 
+0

orandovありがとう、それは完璧に動作します。私はジョンの答えを正しいとマークした。まだ助けてくれてありがとう。 –