2009-07-28 7 views
7

Mam klasy o nazwie profilu, który ma kilka prostych właściwości, a następnie może mieć kolekcję ProfileItem że znowu ma kilka prostych właściwości, a następnie może mieć kolekcję ProfileItem (rekurencja).Rekursja z literaturą XML w VB.NET jest możliwa?

Teraz próbuję wygenerować bardzo prostą funkcję zapisywania przy użyciu XML Literals, które pochodzą z VB.NET (3.5).

Kod używam jest następujący:

Dim xdoc As XDocument = _ 
      <?xml version="1.0" encoding="utf-8"?> 
      <profiles> 
       <%= _ 
        From p In _Profiles _ 
        Select <profile name=<%= p.Name %>> 
           <%= _ 
            From i In p.GetProfileItems _ 
            Select <item> 
               <name><%= i.Name %></name> 
               <action><%= i.Action.ToString %></action> 
               <type><%= i.Type.ToString %></type> 
               <arguments><%= i.Arguments %></arguments> 
               <dependencies> 
                <%= _ 
                 From d In i.GetDependencies _ 
                 Select <dependency> 
                   <name><%= d.Name %></name> 
                  </dependency> _ 
                %> 
               </dependencies> 
              </item> _ 
           %> 
          </profile> _ 
       %> 
      </profiles> 

Część związana z tagiem powinny stać rekurencyjny, ale nie wiem, czy jest to w jakiś sposób obsługiwanym przez składni.

Czy powinienem napisać ponownie, unikając używania XML Literal do implementacji rekursji?

+0

Wow od robienia C# xml literałów po prostu nie wyglądać lub czuć się dobrze. –

Odpowiedz

9

Rekursja jest jednym z powodów, dla których kocham literały XML VB.NET!

Aby wykonać rekursję, potrzebna jest funkcja akceptująca kolekcję ProfileItems i zwracająca wartość XElement. Następnie możesz rekursywnie wywoływać tę funkcję wewnątrz swojego XML Literal.

Ponadto, aby rekursja działała, GetProfileItems i GetDependencies muszą mieć tę samą nazwę (zmienić nazwę jednego z nich) i wyświetlać z tą samą strukturą Element Xml. Oto co funkcja rekurencyjna może wyglądać następująco:

Function GetProfileItemsElement(ByVal Items As List(Of ProfileItem) As XElement 
    Return <items> 
       <%= From i In Items _ 
        Select <item> 
           <name><%= i.Name %></name> 
           <!-- other elements here --> 
           <%= GetProfileItemsElement(i.GetDependencies) %> 
          </item> %> 
      </items> 
End Function 

rekursji zakończy się, gdy pojawi się element, który zwraca pustą listę dla funkcji GetDependencies. W takim przypadku zagnieżdżony element items będzie pusty: <items/>. Literały XML są wystarczająco inteligentne, aby połączyć początkowe i końcowe znaczniki items, gdy nie ma żadnych elementów podrzędnych.

+0

Wielki Dennis, twoja odpowiedź bardzo mi pomogła – Drake