使用XDocument按属性查找元素

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

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

我的XML如下:

     ...    

你有任何线索可以解释这个问题吗?

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

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

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

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

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

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

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

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

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

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

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

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

 IEnumerable users = XMLDoc.Root . etc 

现在,最后 – 如果User元素没有GUID属性呢? 目前,此代码将抛出exception。 这可能正是你想要的 – 或者可能不是。 如果不是,你可以通过施放到Nullable aka Guid?来忽略这些事情Guid? 代替:

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