使用XDocument按属性查找元素

Nac*_*cho 24 c# xml linq linq-to-xml

此查询似乎有效,但我有0结果.

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

我的XML如下:

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

</Users>
Run Code Online (Sandbox Code Playgroud)

你有什么线索可以解释这个问题吗?

Jon*_*eet 47

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

  • 看着 XDocument.Root.Elements("User")
  • 使用Descendants("User")找出所有用户的元素.

我暂时坚持前者.这给了我们:

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

现在,我们仍然可以进一步整理它.首先,让我们来Guid代替string:

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

但是,在这里使用查询表达式没有太多理由......你所应用的只是一个谓词.我们Where直接使用该方法:

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

你如何解决问题取决于你当然:)使用更长的线,你可以在更长的第一行下对齐所有东西:

IEnumerable<XElement> users = XMLDoc.Root
                                    . etc
Run Code Online (Sandbox Code Playgroud)

现在,最后 - 如果User元素没有GUID属性呢?目前,此代码将抛出异常.这可能正是你想要的 - 或者可能不是.如果不是,你可以通过转换为Nullable<Guid>aka Guid?来忽略这些事情:

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

  • 我不担心.乔恩有47万分. (14认同)
  • 他设法在三年内将他的积分翻倍 (3认同)

Pat*_*her 32

Users在第二行更改为User.像这样:

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

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

  • 正如Jon在下面指出的那样,选择正确的类型是更好的选择.另外,如果你使用"el.Attribute("GUID").值"你自动获得一个字符串作为返回类型,并且不需要演员. (3认同)
  • `root`应该是`XMLDoc.root.Elements("User")`中的`Root`. (2认同)