2009-07-28 25 views
7

Tôi có một lớp được gọi là Hồ sơ rằng có một số đặc tính đơn giản và sau đó nó có thể có một bộ sưu tập của ProfileItem đó một lần nữa có một số đặc tính đơn giản và sau đó nó có thể có một bộ sưu tập của ProfileItem (đệ quy).Đệ quy với XML Literals trong VB.NET là có thể?

Bây giờ tôi đang cố gắng tạo ra một chức năng lưu rất đơn giản bằng cách sử dụng XML Literals đi kèm với VB.NET (3.5).

Mã Tôi đang sử dụng như sau:

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> 

Phần liên quan đến thẻ nên trở thành đệ quy, nhưng tôi không biết nếu nó là trong một số cách hỗ trợ bởi cú pháp này.

Tôi có nên viết lại tất cả việc tránh sử dụng XML Literal để thực hiện đệ quy không?

+0

Chà vì việc thực hiện các ký tự C# xml không nhìn hoặc cảm thấy đúng. –

Trả lời

9

Đệ quy là một trong những lý do tôi yêu thích VB.NET XML Literals!

Để thực hiện đệ quy, bạn cần một hàm chấp nhận bộ sưu tập ProfileItems và trả về XElement. Sau đó, bạn có thể gọi đệ quy hàm đó bên trong XML Literal của bạn.

Ngoài ra, để đệ quy hoạt động, GetProfileItems và GetDependencies cần có cùng tên (đổi tên một trong số chúng) và hiển thị với cấu trúc Xml Element giống nhau. Dưới đây là chức năng đệ quy có thể trông như thế nào:

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 

Việc đệ quy sẽ kết thúc khi bạn đến một mục trả về danh sách trống cho hàm GetDependencies. Trong trường hợp đó, phần tử lồng nhau items sẽ trống: <items/>. XML Literals đủ thông minh để kết hợp các thẻ bắt đầu và kết thúc items khi không có bất kỳ phần tử con nào.

+0

Dennis tuyệt vời, câu trả lời của bạn đã giúp tôi rất nhiều – Drake

Các vấn đề liên quan