2016-07-27 42 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

相关问题