2010-04-21 5 views
2

J'ai les données XML suivantes:Recherche Decendants en XML à LINQ

<portfolio> 
    <item> 
    <title>Site</title> 
    <description>Site.com is a </description> 
    <url>http://www.site.com</url> 
    <photos> 
     <photo url="http://www.site.com/site/thumbnail.png" thumbnail="true" description="Main" /> 
     <photo url="http://www.site.com/site/1.png" thumbnail="false" description="Main" /> 
    </photos> 
    </item> 
</portfolio> 

En C# J'utilise la requête de lien suivant:

List<PortfolioItem> list = new List<PortfolioItem>(); 
XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath("~/app_data/portfolio.xml")); 

list = (from portfolio in xmlDoc.Descendants("item") 
     select new PortfolioItem() 
     { 
      Title = portfolio.Element("title").Value, 
      Description = portfolio.Element("description").Value, 
      Url = portfolio.Element("url").Value 
     }).ToList(); 

Comment puis-je faire pour interroger le nœud de photos? Dans la classe PortfolioItem J'ai une propriété:

List<Photo> Photos {get;set;}

Toutes les idées seraient grandement appréciés!

Répondre

1

Je fais quelques suppositions au sujet de votre classe photo, en supposant dans l'intérêt de cette réponse que vous initialiseriez l'URL dans le constructeur, et les deux autres par leurs propriétés. La manière la plus simple est de considérer Photos une propriété de plus à retourner dans votre requête linq mail, et de le créer avec une sous-requête simple.

list = (from portfolio in xmlDoc.Descendants("item") 
      select new PortfolioItem() 
      { 
       Title = portfolio.Element("title").Value, 
       Description = portfolio.Element("description").Value, 
       Url = portfolio.Element("url").Value, 
       Photos = (From P In portfilio.Element("photos").Elements("photo") 
        Select new Photo(P.Attribute("url").Value) 
         { 
          .Thumbnail = bool.Parse(P.Attribute("thumbnail").Value), 
          .Description = P.Attribute("description").Value 
         }).ToList() 
      }).ToList(); 

Une bonne occasion de vérifier le concept de closures dans LINQ si vous avez pas déjà.

1

En supposant que votre classe photo ressemble à ceci:

class Photo 
{ 
    public string Url { get; set; } 
    public bool Thumbnail { get; set; } 
    public string Description { get; set; } 
} 

Vous pouvez le faire comme ceci:

list = (from portfolio in xmlDoc.Descendants("item") 
     select new PortfolioItem() 
     { 
      Title = portfolio.Element("title").Value, 
      Description = portfolio.Element("description").Value, 
      Url = portfolio.Element("url").Value, 
      Photos = portfolio 
         .Element("photos") 
         .Elements("photo") 
         .Select(e => new Photo { 
          Description = e.Attribute("description").Value, 
          Url = e.Attribute("url").Value, 
          Thumbnail = bool.Parse(e.Attribute("thumbnail").Value), 
         }).ToList() 
     }).ToList(); 
0

Pas aussi vite que les autres, mais encore une fois quelque chose de très similaire:

Si vos classes PortfolioItem et Photo ressemblent à ceci:

public class PortfolioItem 
    { 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public string Url { get; set; } 
     public List<Photo> Photos { get; set; } 
    } 

    public class Photo 
    { 
     public string url { get; set; } 
     public string thumbnail { get; set; } 
     public string description { get; set; } 
    } 

Puis interroger le nœud photos et remplir la liste de photos comme suit:

var list = (from portfolio in xmlDoc.Descendants("item") 
    select new PortfolioItem() 
      { 
        Title = portfolio.Element("title").Value, 
        Description = portfolio.Element("description").Value, 
        Url = portfolio.Element("url").Value, 
        Photos = portfolio.Elements("photos") 
          .Elements("photo") 
          .Select(p => new Photo { 
           url = p.Attribute("url").Value, 
           thumbnail = p.Attribute("thumbnail").Value, 
           description = p.Attribute("description").Value 
           }).ToList() 
        }).ToList();