2009-07-28 12 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 Literalsを愛する理由の1つです!

再帰を行うには、ProfileItemsコレクションを受け取り、XElementを返す関数が必要です。次に、XMLリテラル内でその関数を再帰的に呼び出すことができます。

また、再帰が機能するためには、GetProfileItemsとGetDependenciesは同じ名前(その名前の1つを変更)と同じ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

関連する問題