C# LINQ到XML递归查询
我有一个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
<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]);
}));