2010-06-24 6 views
0

C'est le xml de test que j'utilise:C# linq-to-xml, Obtenir une liste avec les nœuds?

<categories> 
<category id="1" name="Test1"> 
    <category id="2" name="Test2"> 
     <misc id="1"></misc> 
    </category> 
</category>  
<category id="3" name="Test3"> 
    <misc id="2"></misc> 
</category>  

Maintenant, je veux lier cela à une vue arborescente ASPX, je veux que les éléments qui ont la catégorie nom et je veux le nom de ceux à apparaître dans l'arborescence.

Il est facile d'obtenir les id et les noms:

var d = from t in data.Descendants("category") 
    select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value }; 

mais comment puis-je garder la structure dans l'arbre?

Cela devrait ressembler à ceci:

Test1

-> Test2

Test3

Répondre

1

Peut-être quelque chose comme ça si je vous comprends bien? (Je ne l'ai pas testé)

class Category 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<Category> SubCategories { get; set; } 
} 

IEnumerable<Category> CategoryTreeStructure(XElement e) 
{ 
    var d = from t in e.Elements("category") 
      select new Category() 
      { 
       ID = t.Attribute("id").Value, 
       Name = t.Attribute("name").Value, 
       SubCategories = CategoryTreeStructure(t) 
      }; 

    return d; 
} 

Appelez avec:

var structure = CategoryTreeStructure(doc.Root); 

« Je veux que les éléments qui ont la catégorie du nom » - Je ne comprends pas ce que vous entendez ici? Mais si vous voulez seulement sélectionner les éléments qui ont un attribut « nom », alors cela devrait fonctionner:

... 
    var d = from t in e.Elements("category") 
      where t.Attribute("name") != null 
      select new Category() 
      ... 

Je comprends que la partie supérieure (l'attribut « nom » partie) n'est pas ce que tu voulais, mais je laisse Là. J'ai testé le code contre:

XDocument doc = XDocument.Parse(@"<categories> 
<category id=""1"" name=""Test1""> 
    <category id=""2"" name=""Test2""> 
     <misc id=""1""></misc> 
    </category> 
</category>  
<category id=""3"" name=""Test3""> 
    <misc id=""2""></misc> 
</category> 
</categories>"); 
      var structure = CategoryTreeStructure(doc.Root); 
+0

Désolé mon mauvais. Je veux seulement des éléments qui s'appellent la catégorie, comme: Patrick

+0

Ahh d'accord, alors le code supérieur devrait être bien :) Je l'ai testé maintenant et cela fonctionne. J'ai posté quelques modifications mineures au code. –

Questions connexes