2016-07-27 4 views
1

Also habe ich diese Funktion, die ich verwende, um das Attribut "Typ" von einem meiner XML-Knoten zu erhalten. In der XML-Datei sind mindestens zwei dieser Knoten enthalten.Zugriff XML-Attribut mit Powershell schlägt für einen Knoten, aber nicht einen anderen

Der XML-Abschnitt sieht wie folgt aus

<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> 

In meiner Funktion unten Ich bin im XML-Objekt $ xmlDoc.config.local.setup vorbei und dann, was ‚Typ‘ Ich erwarte zu finden. Die Nutzung wäre so etwas wie

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

Der erste Ordnertyp ‚backup_root‘ ich sehen kann, wenn Sie den Code debuggen. Wenn die Übereinstimmung nicht wie erwartet erreicht wird, wird die zweite "day_template" nie gefunden. Die foreach-Schleife springt aus irgendeinem Grund direkt an ihr vorbei und ich bin mir nicht sicher warum.

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() 
     } 
    } 
    } 
} 

Ich bin sicher, dass dieses Problem hat alles zu tun, wie ich die XML-Parsing bin und wie es tatsächlich im Speicher organisiert, aber ich kann es nicht herausgefunden. Jede Hilfe wird sehr geschätzt.

Antwort

1

Das Problem ist, dass Sie nur die Ordner der obersten Ebene aufzählen, aber Ihre Ordnerstruktur ist geschachtelt, daher sehen Sie nur "backup_root".
Sie entweder Ihre Funktion aufrufen können rekursiv oder wählen Sie alle folder Tags unter Ihrem $folders Knoten, wie dies getan werden könnte:

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

als das letzte bereits einen XPath-Ausdruck verwendet, könnten wir Ihre Schleife zusammen und Umschreiben beseitigen Ihre Funktion so

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

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

Vielen Dank. Das hat den Trick gemacht. Ich hatte vergessen, dass einige dieser Einträge im XML verschachtelt waren. Danke, dass du darauf hingewiesen hast. – todd1215

Verwandte Themen