gpt4 book ai didi

c# - LINQ to XML 查询同级元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:25 25 4
gpt4 key购买 nike

如果这个问题很基础,我很抱歉,但我并没有经常使用 XML,这是我第一次使用 LINQ to XML...

我有一个结构类似于目录树的 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>
</Site>

这样,每个文件都会从其父文件夹(或祖父文件夹等)继承安全性,具体取决于 <security></security> 在树上的位置。

我希望能够在给定文件的 GUID 的情况下使用 LINQ 选择该文件,并收集与该文件所继承的安全性相关联的所有角色。

这是我目前所做的,但这是一个非常粗略的尝试,并不完整:

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"));

附言。站点地图文件位于与编写此代码的类相同的目录中

最佳答案

看起来你想沿着文件夹祖先链向上走,并积累你一路上找到的角色。您可以使用恰当命名的 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() 在这方面)和这个 resulted in a NullPointerException .它已更新为返回一个空的 XElement 数组。

关于c# - LINQ to XML 查询同级元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com