[英]LINQ to XML querying for sibling elements
很抱歉,如果這個問題非常基礎,但我沒有使用過很多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"));
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應該有
<File>
<role>Admin</role>
</File>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.