我正在使用 LINQ 过滤从 Sharepoint WSS3 的listService.GetListItems()
方法返回的 XmlNode。
这是它返回的 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"
尝试过滤任何包含空值的内容,但结果相同。我查看了一些示例,并且似乎具有正确的语法。
有人可以解释是什么导致最后一个 XElement 返回 null 吗?我真的不明白为什么它会向<IEnumerable<XElement> result
集合中添加一个空实例。