LINQ для чтения XML и выполнения фрагмента - PullRequest
0 голосов
/ 29 декабря 2011

У меня очень похожий вопрос: LINQ для чтения XML

Мне нужно пройти через структуру XML, которая имеет много дочерних элементов. Код в ссылке выше, я полагаю, использует только первые два дочерних элемента. Как я могу пройти несколько уровней глубоко в структуре и выполнить фрагмент кода?

Это код, который я пытаюсь выполнить для каждого элемента, который необходим для создания сайтов sharepoint:

SPWeb mySite = SPContext.Current.Web;
SPWebCollection subSites = mySite.Webs;
string currentTemplate = mySite.WebTemplate;

string siteUrl = TextBox1.Text.ToString();
string siteTitle = TextBox2.Text.ToString();
string siteDescription = TextBox3.Text.ToString();

subSites.Add(siteUrl, siteTitle, siteDescription, 1033, 
   currentTemplate, true, false); 

1 Ответ

0 голосов
/ 29 декабря 2011

Вот рекурсивное решение, список x в методе RecurseElements как раз и позволяет увидеть, как выглядят потомки по сравнению с запросами к ним.Вам также необходимо настроить его, чтобы запросить все, что вам нужно.Я просто вытягиваю из имени атрибута.Кроме того, если вы хотите установить максимальную глубину рекурсии, просто добавьте это в оператор if вверху:

using System.Linq;
using System.Xml.Linq;
using System.Collections.Generic;

  private void RecurseElements(IEnumerable<XElement> descendants, int level)
  {
     if (descendants == null || !descendants.Any()) return;

     foreach (var d in descendants)
     {
        string levelName = d.Attribute("name").Value;
        System.Diagnostics.Debug.Print(string.Format("Level name {0}", levelName));
        var x = d.Descendants().ToList();
        var descendantElms = d.Descendants(string.Format("level{0}", level+1)).ToList();
        RecurseElements(descendantElms, level+1);
     }
  }

Вызовите выше с помощью чего-то похожего на:

     XElement config = XElement.Parse(
         @"<root>
             <level1 name=""level1A"">
                 <level2 name=""level2A"">
                     <level3 name=""level3A"">
                         <level4 name=""level4A"">
                             <level5 name=""level5A"">
                                 <level6 name=""level6A"">
                                     <level7 name=""level7A"">
                                         <level8 name=""level8A""></level8>
                                     </level7>
                                 </level6>
                             </level5>
                         </level4>
                     </level3>
                 </level2>
             </level1>
             <level1 name=""level1B"">
                 <level2 name=""level2B"">
                     <level3 name=""level3B"">
                         <level4 name=""level4B"">
                             <level5 name=""level5B"">
                                 <level6 name=""level6B"">
                                     <level7 name=""level7B"">
                                         <level8 name=""level8B""></level8>
                                     </level7>
                                 </level6>
                             </level5>
                         </level4>
                     </level3>
                 </level2>
             </level1>
         </root>"
     );

     var descendants = config.Descendants("level1").ToList();
     RecurseElements(descendants, 1);

Вашвыходные данные отладки должны выглядеть следующим образом:

Level name level1A
Level name level2A
Level name level3A
Level name level4A
Level name level5A
Level name level6A
Level name level7A
Level name level8A
Level name level1B
Level name level2B
Level name level3B
Level name level4B
Level name level5B
Level name level6B
Level name level7B
Level name level8B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...