LINQ和XmlNodes元素

时间:2012-05-28 15:33:51

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

我正在尝试从此XML返回属性值,这是从Sharepoint Webmethod调用的XmlNodes的集合。

XML数据

 <Lists xmlns="http://schemas.microsoft.com/sharepoint/soap/">

    <List DocTemplateUrl="" DefaultViewUrl="/Lists/Announcements/AllItems.aspx" MobileDefaultViewUrl="" ID="{E6172717-EB95-4845-B8CB-8161832565C6}" Title="Announcements" Description="Use the Announcements list to post messages on the home page of your site." ImageUrl="/_layouts/images/itann.gif" Name="{E6172717-EB95-4845-B8CB-8161832565C6}" BaseType="0" FeatureId="00bfea71-d1ce-42de-9c63-a44004ce0104" />


    <List DocTemplateUrl="" DefaultViewUrl="/Lists/Calendar/calendar.aspx" MobileDefaultViewUrl="" ID="{C0735477-BE48-4DDF-9D93-3E1F8E993CEC}" Title="Calendar" Description="Use the Calendar list to keep informed of upcoming meetings, deadlines, and other important events." ImageUrl="/_layouts/images/itevent.gif" Name="{C0735477-BE48-4DDF-9D93-3E1F8E993CEC}" BaseType="0" FeatureId="00bfea71-ec85-4903-972d-ebe475780106" />

///... Several more like this
    </Lists>

我一直在关注一些不同的指南,只是经历了like this one on DiC,我已经设法让这些示例发挥作用。

 public List<Dictionary<string, XmlAttribute>> GetListData(XmlNode collection)
    {            
        #region Test
    string nodeInput = Convert.ToString(collection.OuterXml);

    TextReader sr = new StringReader(nodeInput);

                 //from <List> node, decendant of <Lists>
    var lists = (from list in XElement.Load(sr).Descendants("List")
                 //where the baseType element value equals 0
                 where int.Parse(list.Element("BaseType").Value) == 0
                 //Output the titles values to a list
                 select list.Element("Title").Value).ToList();
     }

    #endregion

我一直在努力使一些示例适应我的数据以获得更多关于它如何工作的想法,但是这个查询没有返回任何不同于我预期的结果。我在评论的每一行中都写过我认为命令在做什么,有人可以说明我的错误吗?


解决方案

一旦我知道命名空间就是问题,很容易找到。

http://msdn.microsoft.com/en-us/library/bb669152.aspx 与VB不同,C#即使节点没有前缀也需要命名空间。

所以我需要一个XNamespace

    XNamespace nameSpace = "http://schemas.microsoft.com/sharepoint/soap/";
    XElement node = XElement.Parse(nodeInput);

    var lists = from list in node.Descendants(nameSpace + "List")
                select list;
    foreach (var list in lists)
    {
        var doc = list.Document;
    }

2 个答案:

答案 0 :(得分:1)

您的代码应为

XNamespace ns = "http://schemas.microsoft.com/sharepoint/soap/";

var lists = (from list in XElement.Parse(nodeInput).Descendants(ns + "List")
             where (int)list.Attribute(ns + "BaseType") == 0
             select (string)list.Attribute(ns + "Title")).ToList();

答案 1 :(得分:0)

<强>解决方案

一旦我知道命名空间就是问题,很容易找到。

http://msdn.microsoft.com/en-us/library/bb669152.aspx 与VB不同,C#即使节点没有前缀也需要命名空间。

所以我需要一个XNamespace

    XNamespace nameSpace = "http://schemas.microsoft.com/sharepoint/soap/";
    XElement node = XElement.Parse(nodeInput);

    var lists = from list in node.Descendants(nameSpace + "List")
                select list;
    foreach (var list in lists)
    {
        var doc = list.Document;
    }