Yaron Buki
Yaron Buki

Reputation: 81

Linq to XML: I am not able to compare the nested element

Thank you in advance, this is a great resource.

I believe the code explains itself, but just in case I am being arrogant I will explain myself.

My program lists movies, to a treeview, according to the drop down lists selected genre. Each movie has a few genres, ergo the nested genres.

This is the XML:

   <movie>
    <title>2012</title>
    <director>Roland Emmerich</director>
    <writtenBy> 
        <writter>Roland Emmerich,</writter>
        <writter>Harald Kloser</writter>
    </writtenBy>
    <releaseDate>12-Nov-2009</releaseDate>
    <actors>
        <actor>John Cusack,</actor>
        <actor>Thandie Newton, </actor>
        <actor>Chiwetel Ejiofor</actor>
    </actors>
    <filePath>H:\2012\2012.avi</filePath>
    <picPath>~\image\2012.jpg</picPath>
    <runningTime>158 min</runningTime>
    <plot>Dr. Adrian Helmsley, part of a worldwide geophysical team investigating the effect on the earth of radiation from unprecedented solar storms, learns that the earth's core is heating up. He warns U.S. President Thomas Wilson that the crust of the earth is becoming unstable and that without proper preparations for saving a fraction of the world's population, the entire race is doomed. Meanwhile, writer Jackson Curtis stumbles on the same information. While the world's leaders race to build "arks" to escape the impending cataclysm, Curtis struggles to find a way to save his family. Meanwhile, volcanic eruptions and earthquakes of unprecedented strength wreak havoc around the world. </plot>
    <trailer>http://2012-movie-trailer.blogspot.com/</trailer>
    <genres>
        <genre>Action</genre>
        <genre>Adventure</genre>
        <genre>Drama</genre>
    </genres>
    <rated>PG-13</rated>
</movie>

This is the code:


 string selectedGenre = this.ddlGenre.SelectedItem.ToString();
            XDocument xmldoc = XDocument.Load(Server.MapPath("~/App_Data/movie.xml"));

 List<Movie> movies =
                (from movie in xmldoc.Descendants("movie")
                 // The treeView doesn't exist
                 where movie.Elements("genres").Elements("genre").ToString() == selectedGenre

  select new Movie
                {
                     Title = movie.Element("title").Value
                }).ToList();

  foreach (var movie in movies)
                {
                    TreeNode myNode = new TreeNode();
                    myNode.Text = movie.Title;
                    TreeView1.Nodes.Add(myNode);
                }

Upvotes: 1

Views: 198

Answers (2)

VVS
VVS

Reputation: 19602

List<Movie> movies =
                (from movie in xmldoc.Descendants("movie")
                 where movie.Elements("genres")
                 .Any((e) => e.Elements("genre").ToString() == selectedGenre);

Upvotes: 0

Doggett
Doggett

Reputation: 3464

Change your code to

List<Movie> movies =
                (from movie in xmldoc.Descendants("movie")
                where movie.Elements("genres").Elements("genre").Any(e => e.Value == selectedGenre)

                select new Movie
                {
                    Title = movie.Element("title").Value
                }).ToList();

This is because there are more than 1 genre node, so you'll have to check if any of them match instead of just the first.

Upvotes: 2

Related Questions