Linq-to-xml查询未返回任何值

本文关键字:任何值 返回 查询 Linq-to-xml | 更新日期: 2023-09-27 18:23:44

我正在提取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无关。

Linq-to-xml查询未返回任何值

您没有在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);
}