2009-07-28 8 views
7

tengo una clase llamada Perfil que tiene algunas propiedades simples y luego se puede tener una colección de ProfileItem que de nuevo tiene algunas propiedades simples y luego se puede tener una colección de ProfileItem (RECURSION).¿Es posible la recursión con XML Literals en VB.NET?

Ahora intento generar una función de guardado muy simple utilizando XML Literals que vienen con VB.NET (3.5).

El código que estoy usando es el siguiente:

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> 

La parte relacionada con la etiqueta debería ser recursivo, pero no sé si es de alguna manera con el apoyo de esta sintaxis.

¿Debo volver a escribir todo evitando el uso de XML Literal para implementar la recursión?

+0

Guau, ya que hacer literales C# xml simplemente no se ven ni se sienten bien. –

Respuesta

9

¡La recursividad es una de las razones por las que amo VB.NET XML Literals!

Para realizar la recursión, necesita una función que acepte una colección ProfileItems y devuelva un elemento XElement. Luego puede llamar recursivamente a esa función dentro de su XML Literal.

Además, para que la recursividad funcione, GetProfileItems y GetDependencies deben tener el mismo nombre (renombrar uno de ellos) y mostrar con la misma estructura Xml Element. Esto es lo que la función recursiva podría ser:

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 

La recursividad terminará cuando se llega a un elemento que devuelve una lista vacía para la función GetDependencies. En ese caso, el elemento anidado items estará vacío: <items/>. XML Literals son lo suficientemente inteligentes como para combinar las etiquetas de inicio y finalización items cuando no hay elementos secundarios.

+0

gran Dennis, tu respuesta me ayudó mucho – Drake

Cuestiones relacionadas