[英]Sharepoint 2010 GetListView Linq XML
試圖處理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,可以返回多個視圖。
經過Selman22的一些指導后,我能夠通過執行以下操作來完成此操作
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();
在這里ToString
將返回Attribute
類型名稱 ,而不是Value
。因此,此語句將始終返回false,而您一無所獲。
x.Element("View").Attribute("DefaultView").ToString() == "TRUE"
相反,您應該使用顯式強制轉換來獲取屬性的值:
(string)x.Element("View").Attribute("DefaultView") == "TRUE"
並且您嘗試使用x.Elements("ViewField")
Select
多個元素,因此您應該使用SelectMany
來獲取List<XElement>
:
xData.Descendants(ns + "ListAndView")
.Where(x => (string)x.Element("View").Attribute("DefaultView") == "TRUE")
.SelectMany(x => x.Elements("ViewField"))
.ToList();
這應該為您提供所有ViewField
元素。如果只希望屬於FieldRef
元素的Name
屬性的Values
,請使用以下命令:
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();
您可以在沒有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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.