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