簡體   English   中英

LINQ to XML查詢兄弟元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM