2016-07-27 50 views
1

所以我有這個函數,我用來從我的XML節點之一獲取屬性「類型」。 XML文件中至少有兩個節點。訪問XML屬性與PowerShell失敗的一個節點,但不是另一個

XML部分看起來像這樣

<config> 
    <local> 
    <setup> 
     <backup type="7Day"/> 
     <folder name="Backups" type="backup_root"> 
      <folder name="DayTemplate" type="day_template"> 
      <folder name="Logs"/> 
      <folder name="Objects"> 
       <folder name="Applications"/> 
      </folder> 
     </folder> 
     </folder> 
     </setup> 
    </local> 
    </config> 

在我的功能在下面,我通過XML對象$ xmlDoc.config.local.setup然後什麼「型」我希望找到。使用情況類似於

$type = Get-FolderNameByType -folders $xmlDoc.config.local.setup -type 'day_template' 

第一個文件夾類型'backup_root'我可以在調試代碼時看到。如果未能按預期匹配,但第二個'day_template'從未找到。 foreach循環由於某種原因跳過它,我不知道爲什麼。

function Get-FolderNameByType 
{ 
    param 
    (
    [Object] 
    $folders, 

    [Object] 
    $type 
) 
    foreach ($folder in $folders.folder) 
    { 
    if ($folder.type) 
    { 
     if ($folder.type -eq $type) 
     { 
     return $folder.name.tostring() 
     } 
    } 
    } 
} 

我敢肯定,這個問題已經一切都與我如何解析XML,以及如何它實際上是有組織的記憶,但我無法弄清楚。任何幫助深表感謝。

回答

1

問題是,您只能枚舉頂層文件夾,但文件夾結構是嵌套的,因此您只能看到'backup_root'。
您可以遞歸調用函數或選擇$folders節點下所有folder標籤可能像這樣做:

... 
foreach ($folder in $folders.SelectNodes('//folder')) 
{ 
    if ($folder.type ... 

當最後一個已使用XPath表達式,我們可以完全消除您的循環和重寫你的功能像這樣

function Get-FolderNameByType 
{ 
    param 
    (
    [Object] 
    $folders, 

    [Object] 
    $type 
) 
    $folders.SelectNodes("//folder[@type='$type']") 
} 
+1

非常感謝。那就是訣竅。我忘記了嵌入在XML中的一些條目。感謝您指出了這一點。 – todd1215

相關問題