LINQ读取XML并执行代码段

时间:2011-12-29 17:01:06

标签: c# .net linq sharepoint linq-to-xml

我有一个非常相似的问题:LINQ to read 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 :(得分:0)

这是一个递归解决方案,RecurseElements方法中的x List就在那里,所以你可以看到Descendants与查询它们相比的样子。您还需要调整它以查询您需要的任何内容。我只是从名称属性中提取。此外,如果要强制执行最大递归深度,只需将其添加到顶部的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