2016-07-27 15 views
1

この関数を使用して、XMLノードの1つから属性 'type'を取得しています。これらのノードの少なくとも2つがXMLファイルにあります。私は、XMLオブジェクトの$ xmlDoc.config.local.setupに渡していると、私は見つけることを期待してるものを「タイプ」の下にアクセス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> 

のように見えます。使用方法は次のようになります

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

最初のフォルダタイプ 'backup_root'は、コードをデバッグするときに表示されます。期待どおりに一致しない場合、2番目の '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」が表示されることです。
あなたは、どちらかのすべてのfolderタグので、同じように行うことができ、あなたの$foldersノードの下に再帰的にあなたの関数を呼び出すか、選択することができます:最後の1がすでにXPath式を使用しているので

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

、我々は完全にあなたのループを排除し、書き換えができあなたのような機能

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

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

ありがとうございました。それがトリックでした。私はこれらのエントリのいくつかがXML内でネストされていることを忘れていました。それを指摘してくれてありがとう。 – todd1215

関連する問題