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)
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,而不是根元素本身.