C# LINQ到XML递归查询

C# LINQ到XML递归查询,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我有一个xml站点地图,其结构类似于文档树,如下所示: <Site> <File GUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">FileName</file> <Folder name="FolderName"> <Security> <Role>Admin</role> </Security> <File GUI

我有一个xml站点地图,其结构类似于文档树,如下所示:

<Site>
<File GUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">FileName</file>
<Folder name="FolderName">
    <Security>
        <Role>Admin</role>
    </Security>
    <File GUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">FileName</file>
    <Folder name="subFoler">
        <File GUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">FileName</file>
        <File GUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">FileName</file>
        <Folder>
            <File GUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">FileName</file>
        </Folder>
    </Folder>
</Folder>
*在信用到期的地方,我得到了这个问题

currentFile
变量的声明中发生了nullreference异常,我不知道为什么。我已经确保guid匹配……而且由于
fileFromMap
声明正确,我知道找到了我的文件。我认为这里需要做的是更好地递归检查父文件夹的安全性。查询可以在找到任何安全性后立即停止,因为按照站点的设置方式,应该没有冲突的安全声明。(例如,已定义安全性的文件夹将不在已定义安全性的文件夹中)

如果我错了,而这不是我需要做的,请提供您可能有的任何建议,并随时相应地更改此问题的标题,以便更好地记录它。

(如果您在上一个问题中给我留下一条评论可能会更好,但我不妨在发布后回答此问题;)

我提供的代码中有一个错误:我认为
SelectMany()
以与
XElement.Add()相同的方式折叠了
null
项,而我错了。如果祖先链中有一个没有角色的文件夹,
SelectMany()
将抛出一个
NullReferenceException

我们只需要为它提供一个空的枚举元素
XElement
,就可以解决这个问题:

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]);
        }));

我将用反向链接更新我的原始答案。

谢谢!现在它工作得很好,我想我对LINQ到XML有了更好的理解!另外,我不确定你是否会看到评论,因为我已经接受了答案,但非常感谢你!
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]);
        }));