使用XDocument按属性查找元素

时间:2010-04-20 20:05:14

标签: 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);

我的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 个答案:

答案 0 :(得分:46)

嗯, 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);

现在,我们仍然可以进一步整理它。首先,让我们转为Guid而不是string

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);

答案 1 :(得分:32)

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

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

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