代码之家  ›  专栏  ›  技术社区  ›  Vince

Sharepoint 2010 GetListView Linq XML

  •  0
  • Vince  · 技术社区  · 12 年前

    试图处理web服务List.asmx从sharepoint返回的XML,但我似乎无法从默认视图获取字段。

    我尝试了以下方面的变化

        var viewFields = (from x in xData.Descendants(ns + "ListAndView")
                         where x.Element("View").Attribute("DefaultView").ToString() == "TRUE"
                         select x.Elements("ViewField")).ToList();
    

    示例XML

        <ListAndView xmlns="http://schemas.microsoft.com/sharepoint/soap/">
          <List DocTemplateUrl="">
            <Fields>
              <Field ID="{03e45e84-1992-4d42-9116-26f756012634}" DisplayName="test" Name="test"/>
            </Fields>
            <RegionalSettings>
              <Language>1033</Language>
              <Locale>1033</Locale>
              <AdvanceHijri>0</AdvanceHijri>
              <CalendarType>1</CalendarType>
              <Time24>False</Time24>
              <TimeZone>480</TimeZone>
              <SortOrder>2070</SortOrder>
              <Presence>False</Presence>
            </RegionalSettings>
            <ServerSettings>
              <ServerVersion>0</ServerVersion>
              <RecycleBinEnabled>True</RecycleBinEnabled>
              <ServerRelativeUrl>/test</ServerRelativeUrl>
            </ServerSettings>
          </List>
          <View Name="{2EDDCDF0-B93D-41A9-83B9-89E347ED93F9}" DefaultView="TRUE" >
            <Query>
              <OrderBy>
                <FieldRef Name="ID" Ascending="FALSE" />
              </OrderBy>
            </Query>
            <ViewFields>
              <FieldRef Name="field1" />
              <FieldRef Name="field2" />
              <FieldRef Name="field3" />
            </ViewFields>
          </View>
        </ListAndView>
    

    linq语句应该确保它只从定义为默认视图的视图返回FieldRef,可以返回多个视图。

    在塞尔曼的一些指导下,我通过以下方式实现了这一点

    var view = xData.Descendants(ns + "View").Where(x => (string)x.Attribute("DefaultView") == "TRUE");
    var f = (from x in view.Descendants(ns + "FieldRef")
            select (string) x.Attribute("Name")).ToList();
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   Selman Genç    12 年前

    在这里 ToString 会回报你的 类型名称 Attribute ,而不是 Value 。因此,此语句将始终返回 假的 你什么也得不到。

    x.Element("View").Attribute("DefaultView").ToString() == "TRUE"
    

    相反,您应该使用显式转换来获取属性的值:

    (string)x.Element("View").Attribute("DefaultView") == "TRUE"
    

    你正在努力 Select 多个元素 x.Elements("ViewField") 所以你应该使用 SelectMany 而是获得 List<XElement> :

    xData.Descendants(ns + "ListAndView")
         .Where(x => (string)x.Element("View").Attribute("DefaultView") == "TRUE")
         .SelectMany(x => x.Elements("ViewField"))
         .ToList();
    

    这应该给你所有 ViewField 元素。如果您只想 Values Name 属于 FieldRef 元素使用此项:

    xData.Descendants(ns + "ListAndView")
         .Where(x => (string)x.Element("View").Attribute("DefaultView") == "TRUE")
         .SelectMany(x => x.Elements("ViewField"))
         .SelectMany(x => x.Elements("FieldRef").Select(y => (string)y.Attribute("Name")))
         .ToList();
    
        2
  •  0
  •   JuniorCoder    12 年前

    你能试着不带linq吗?

    我会这样做。

    假设您有以下对象:

    var listItems = client.GetListItems(listGuid, null, null, viewFields,
                                                null, null, null);
    

    我将使用一个简单的for循环使视图字段在集合中迭代:

    var listOfViewFields = new List<string>();
    
    foreach (XmlNode node in listItems)
    {
       if (node.Name == "rs:data")
       {
          for (int f = 0; f < node.ChildNodes.Count; f++)
          {
          if (node.ChildNodes[f].Name == "z:row")
          {
            var xmlAttributeCollection = node.ChildNodes[f].Attributes;
            if (xmlAttributeCollection != null)
            {
                listOfViewFields.Add(xmlAttributeCollection["ows_FIELD YOU WISH TO RETRIEVE"].Value);
            }
         }
      }
    }