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