我正在提取SharePoint网站集用户的XML列表,然后尝试查询InnerXml。 InnerXml看起来像这样:
<Users xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/">
<User ID="91" Name="Jane Smith" LoginName="domain1\jsmith" />
<User ID="814" Name="Brad Jones" LoginName="domain1\bjones" />
<User ID="1252" Name="Charles Johnson" LoginName="domain2\cjohnson" />
</Users>
查询未返回任何内容(el
为空),即使有ID为814的用户。
XmlNode siteUsers = tempug.GetUserCollectionFromSite();
XElement root = XElement.Parse(siteUsers.InnerXml);
IEnumerable<XElement> siteUsersElement =
from el in root.Elements("User")
where (string)el.Attribute("ID") == "814"
select el;
foreach (XElement el in siteUsersElement)
Console.WriteLine("el: " + el);
root
包含InnerXml文本,因此我认为该问题与SharePoint没有任何关系。
答案 0 :(得分:3)
您未在Elements
来电中指定命名空间。幸运的是,在LINQ to XML中这很容易:
XNamespace ns = "http://schemas.microsoft.com/sharepoint/soap/directory/";
...
from el in root.Elements(ns + "User");
如果您知道ID
属性将始终是一个整数,我实际上已经明确了,并且当它对您没有帮助时也避免使用查询表达式:
// TODO: Find a nicer way of doing this; you shouldn't need to parse it again
XElement root = XElement.Parse(siteUsers.InnerXml);
var siteUserElements = root.Elements(ns + "User")
.Where(el => (int) el.Attribute("ID") == 814);
foreach (XElement el in siteUserElements)
{
Console.WriteLine("el: " + el);
}