2009-07-28 2 views
7

나는 프로필 간단한 특성을 가지고라는 클래스가 후 다시 몇 가지 간단한 특성을 가지고 ProfileItem의 컬렉션을 가질 수 있으며 다음은 ProfileItem (재귀)의 컬렉션을 가질 수 있습니다.VB.NET에서 XML 리터럴을 사용한 재귀가 가능합니까?

이제 VB.NET (3.5)과 함께 제공되는 XML 리터럴을 사용하여 매우 간단한 저장 함수를 생성하려고합니다.

내가 사용하고있는 코드는 다음 태그와 관련된

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> 

부분은 순환이되어야하지만,이 구문에서 지원하는 몇 가지 방법에 있는지 모르겠어요.

재귀를 구현하기 위해 XML 리터럴 사용을 피하는 것이 좋습니다.

+0

C# xml 리터럴을 수행 한 이후로 와우는 모양이 나쁘다고 생각하지 않습니다. –

답변

9

재귀는 내가 VB.NET XML 리터럴을 좋아하는 이유 중 하나입니다!

재귀를 수행하려면 ProfileItems 컬렉션을 받아들이고 XElement를 반환하는 함수가 필요합니다. 그런 다음 XML Literal에서 해당 함수를 재귀 적으로 호출 할 수 있습니다.

또한 재귀가 작동하려면 GetProfileItems와 GetDependencies가 같은 이름을 가지며 (둘 중 하나의 이름이 바뀜) 동일한 XML 요소 구조로 표시되어야합니다. 당신이 GetDependencies 기능에 대한 빈리스트를 반환하는 항목에 도착하면 종료됩니다

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 

재귀 다음은 재귀 함수가 어떻게 보이는지입니다. 이 경우 중첩 된 items 요소는 비어 있습니다 (<items/>). XML 리터럴은 자식 요소가 없을 때 items 태그의 시작과 끝을 결합 할만큼 똑똑합니다.

+0

위대한 데니스, 당신의 대답은 제게 많은 도움이되었습니다. – Drake