使用XDocument根据属性查找元素

30

这个查询语句看起来是有效的,但是我没有得到任何结果。

IEnumerable<XElement> users =
            (from el in XMLDoc.Elements("Users")
             where (string)el.Attribute("GUID") == userGUID.ToString()
             select el);

这是我的XML代码:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Users>
  <User GUID="68327fe2-d6f0-403b-a7b6-51860fbf0b2f">
    <Key ID="F7000012ECEAD101">
      ...
    </Key>
  </User>

</Users>

你有什么线索可以帮助解决这个问题吗?

2个回答

55

好的,Users元素没有GUID属性。有两个建议的选项:

  • 查看XDocument.Root.Elements("User")
  • 使用Descendants("User")来查找所有 User 元素。

我暂时会选择前者。这给了我们:

IEnumerable<XElement> users =
            (from el in XMLDoc.Root.Elements("User")
             where (string) el.Attribute("GUID") == userGUID.ToString()
             select el);

现在,我们仍然可以进一步整理这个代码。首先,让我们将其从string转换为Guid类型:

IEnumerable<XElement> users =
    (from el in XMLDoc.Root.Elements("User")
     where (Guid) el.Attribute("GUID") == userGUID
     select el);

然而在这里使用查询表达式的理由不多...你只是应用了一个单一的谓词。让我们直接使用Where方法:

IEnumerable<XElement> users = 
    XMLDoc.Root
          .Elements("User")
          .Where(el => (Guid) el.Attribute("GUID") == userGUID);

当然如何进行布局是由您自行决定的 :) 对于较长的行,您可以在较长的第一行下对齐所有内容:

IEnumerable<XElement> users = XMLDoc.Root
                                    . etc

那么,最后一个问题 - 如果User元素没有GUID属性怎么办?目前,这段代码会抛出异常。这可能正是您想要的 - 也可能不是。如果不是,您可以通过将其转换为Nullable<Guid>,也就是Guid?来忽略这些东西:

IEnumerable<XElement> users = 
    XMLDoc.Root
          .Elements("User")
          .Where(el => (Guid?) el.Attribute("GUID") == userGUID);

谢谢,这也非常有用,可惜我只能标记一个为正确。 - Ignacio

39

将第二行中的Users更改为User。就像这样:

    IEnumerable<XElement> users = (from el in XMLDoc.Root.Elements("User")
                                   where (string)el.Attribute("GUID") ==  userGUID.ToString()
                                   select el);

我假设XMLDoc是一个XDocument对象,而不是根元素本身。


1
谢谢,这部分是我需要的,是我犯了一个愚蠢的错误。 - Ignacio
3
正如Jon在下面指出的那样,将变量转换为正确的类型是更好的选择。此外,如果您使用"el.Attribute("GUID").Value",则会自动获取字符串作为返回类型,无需进行转换。 - Dan Bailiff
2
XMLDoc.root.Elements("User") 中的 root 应该改为 Root - Appulus
我知道这是一个较旧的帖子,但是假设userGUID是GUID,它不应该是“where el.Attribute("GUID").Value == userGUID.ToString()”吗? - Levi Fuller
我该如何使用Sharepoint的_api源实现相同的功能?我想要从每个父元素中获取多个子元素。 - Si8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接