LINQ to XML查询兄弟元素
很抱歉,如果这个问题非常基础,但我没有使用过很多XML,这是我第一次使用LINQ to XML …
我有一个XML站点地图,其结构类似于目录树:
FileName Admin FileName FileName FileName FileName
这样,每个文件都将从其父文件夹(或祖父文件夹等)inheritance安全性,具体取决于所在的树的距离。
我希望能够在给定文件的GUID的情况下,使用LINQ选择该文件,并收集与文件已inheritance的安全性相关联的所有角色。
这是我到目前为止所做的,但这是一个非常粗略的尝试,并不完整:
XDocument sitemap = XDocument.Load(@"\sitemap.xml"); XElement currentFile = new XElement("File", from file in sitemap.Elements("File") where file.Element("GUID").Equals(guid) select file.Parent.Element("security").Elements("role"));
PS。 站点地图文件与编写此代码的类位于同一目录中
看起来你想要走上文件夹祖先链并累积你沿途找到的角色。 你可以使用恰当命名的Ancestors()和SelectMany()方法来做到这一点:
XElement fileFromMap = sitemap.Descendants("File").Where( file => file.Attribute("GUID").Value == guid.ToString("D")).Single(); XElement currentFile = new XElement("File", fileFromMap.Value, fileFromMap.Ancestors("Folder").SelectMany( folder => { XElement security = folder.Element("Security"); return (security != null ? security.Elements("Role") : new XElement[0]); }));
编辑:更改元素大写以匹配更新的问题。
编辑2:上面的代码错误地将一个null
项提供给SelectMany()
(在这方面远不如XElement.Add()
那么放纵),这导致了NullPointerException
。 它已更新为返回一个空的XElement
数组。
试试这个(我通常做方法语法,但你应该能够转换为查询语法)
XElement currentFile = new XElement("File", sitemap.Descendants("file").Where( file => file.Attribute("GUID").Value.Equals(guid)).Select( file => file.Parent.Element("security").Elements("role")));
这里currentFile应该有
Admin