2009-09-22 9 views
2

J'ai une question LINQ to XML. Je xml comme ceci:LINQ to XML Débutant Question: Lire xml et classer par attribut

<pages> 
    <page Name="Welcome" Control="Welcome" Order="1"></page> 
    <page Name="Summary" Control="Summary" Order="10"></page> 
</pages> 

je dois lire les données et l'enregistrer dans un tableau commandé par l'attribut « Order ». Voici ce que j'ai le compilateur tousse sur la clause order by.

//read in app.xml data into _Pages 
XDocument doc = XDocument.Parse("app.xml"); 
XElement Pages = (XElement)doc.Descendants("pages"); 

var Pages1 = 
    (from page in Pages //<-- error on orderby clause 
    orderby page.order 
    select page).ToArray(); 

J'ai recherche SO et a trouvé plusieurs réponses LINQ pour XML qui ressemble à ceci, mais dire quelque chose sur le fragment XML dans un objet comme les pages. Mais ne montre jamais son type.

Merci

EDIT: L'erreur est: Impossible de trouver une implémentation du modèle de requête pour le type de source 'System.Xml.Linq.XElement'. 'OrderBy' n'a pas été trouvé.

+1

Pour commencer XDocument.Parse est faux! Je suppose que vous utilisez Load? – RichardOD

Répondre

4

Je devine que vous voulez quelque chose comme ceci:

using System.Linq; 
using System.Xml.Linq; 
namespace SampleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = @"<pages> 
       <page Name=""Summary"" Control=""Summary"" Order=""10""></page> 
       <page Name=""Welcome"" Control=""Welcome"" Order=""1""></page> 
      </pages>"; 
      XDocument doc = XDocument.Parse(xml); 
      XElement[] pages = doc 
       .Descendants("page") 
       .OrderBy(x => (int)x.Attribute("Order")) 
       .ToArray(); 
     } 
    } 
} 

Est-ce que ce travail pour vous? Cela fonctionne à condition que l'attribut Order soit toujours un int (j'ai fait une supposition ici).

+0

Richard, l'Ordre est toujours un int. Cependant, cela génère une erreur de compilation sur moi (VS2k8 SP1). 'System.Collections.Generic.IEnumerable ' ne contient pas de définition pour 'OrderBy' et aucune méthode d'extension 'OrderBy' n'accepte un premier argument de type 'System.Collections.Generic.IEnumerable < System.Xml.Linq.XElement> 'peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) \t C: \ Utilisateurs \ devloper \ Documents \ Visual Studio 2008 \ Projets \ OCHSHP_APP_FC \ OCHSHP_APP_FC \ WebApp.cs OCHSHP_APP_FC – Chad

+2

Ah OK - assurez-vous de disposer de ces instructions using using System.Linq; en utilisant System.Xml.Linq; – RichardOD

+0

J'ai mis à jour l'exemple de code avec une liste complète. – RichardOD

1

Essayez page.Attribute ("order") au lieu de page.order.

+0

merci pour la réponse Matt. J'ai édité par question pour le rendre plus clair. Il lance l'erreur sur l'objet Pages (XElement). Peut-être que XElement n'est pas le type d'objet approprié pour ce type de requête? – Chad

+0

La valeur de retour de 'doc.Descendants (" pages ")' est de type 'IEnumerable ' - vous ne pouvez pas convertir ceci en 'XElement'. Utilisez '.First()' s'il y a plusieurs éléments et que vous voulez juste le premier, ou '.Single()' si vous savez qu'il n'y en aura qu'un (et que vous voulez une exception s'il y en aura plus). –

+0

Je suis upvoting parce que c'est une réponse utile. – RichardOD