我使用LINQ來過濾從Sharepoint WSS3的listService.GetListItems()
方法返回的XmlNode。Foreach迭代空
這是它返回的XML: http://pastebin.com/mqHcserY
我觀察到,最後一行是對別人不同,它不包含以下屬性。
ows_ContentType
ows_LinkFilenameNoMenu
ows_LinkFilename
ows_BaseName
ows__EditMenuTableStart
所以考慮到這一點我與LINQ過濾結果:
XmlNode items = listService.GetListItems(listName, string.Empty, query, viewFields, string.Empty, queryOptions, g.ToString());
// Namespace for z: prefix
XNamespace xns = "#RowsetSchema";
XElement root;
using (XmlReader xr = new XmlNodeReader(items)) { root = XElement.Load(xr); }
// This query returns XElements that are Folder types
IEnumerable<XElement> result = from child in root.Descendants(xns + "row")
where child.Attribute("ows_ContentType").Value != null && child.Attribute("ows_ContentType").Value == "Folder"
select child;
foreach (XElement xml in result)
{
//Exception when attempts to loop final XElement
}
然而,當我遍歷這些結果,我收到了NullReferenceException
。在Foreach循環中,它將愉快地遍歷每個對象,直到到達最後一個對象,然後它會拋出異常。
這最後一個對象是不同於其他行的(我通過消除過程知道這一點,我看到每隔一行都被循環過去),並且應該已經過濾掉我的結果,因爲它沒有「 ows_ContentType「屬性。
我將LINQ更改爲where child.Attribute("ows_ContentType").Value != null && child.Attribute("ows_ContentType").Value == "Folder"
,嘗試過濾任何可能包含空值但結果相同的東西。 我看了幾個samples,我似乎有正確的語法。
有人能解釋一下是什麼導致這個最後的XElement返回null嗎? 我真的不明白爲什麼它會將一個空實例添加到<IEnumerable<XElement> result
集合中。
你是否在您的循環中修改了所有節點? – Rawling
怎麼樣在哪兒child.Attribute(「ows_ContentType」)!= null而不是調用值?從一個不存在的節點調用值將會拋出一個異常 – middelpat
啊,這很有道理。 Muchas gracias! – Amicable