此查询似乎有效,但我有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>
你有什么线索可以解释这个吗?
答案 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,而不是根元素本身。