Frage

Dies ist der Test xml, dass ich benutze:

<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>    

Jetzt möchte ich binden, das zu einer ASPX treeview, ich will nur die Elemente, die den Namen der Kategorie haben, und ich möchte den Namen derer, die in der Baumansicht angezeigt werden.

Es ist einfach, die ID und Namen zu erhalten:

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

aber wie halte ich die Struktur in der Strukturansicht?

Dies sollte wie folgt aussehen:

Test1

-> Test2

Test3

War es hilfreich?

Lösung

Vielleicht so etwas, wenn ich Sie richtig verstanden? (Ich habe es nicht getestet)

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;
}

Nennen Sie es mit:

var structure = CategoryTreeStructure(doc.Root);

„ich will nur die Elemente, die den Namen der Kategorie haben“ - Ich verstehe nicht, was Sie hier bedeuten? Aber wenn Sie nur diejenigen Elemente auswählen möchten, die ein Attribut „name“ haben, dann sollte diese Arbeit:

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

Ich verstehe, dass die obere (das Attribut „name“ Teil) ist nicht das, was Sie wollten, aber ich lasse es dort. Ich habe den Code gegen getestet:

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);

Andere Tipps

Eigentlich habe ich diesen Link gefunden, die genau das tut, was Sie fordern :) Und es ist ohne LINQ, so dass ich dachte, dass es eine andere Antwort verdient.

http://www.15seconds.com/issue/041117.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top