2012-12-05 12 views
7

Mam następujący:pętli poprzez elementów XML

$aMyArray = $null 


[xml]$userfile = Get-Content C:\AppSense\Scripts\AmPolicyConversion\AM_dev.xml 

$i = 0 
FOREACH ($j in $userfile.ChildNodes){ 

    FOREACH($k in $j.DocumentElement) { 

    } 

    $i = $i + 1 
} 

Próbuję dowiedzieć się, w jaki sposób pętli każdego elementu w PowerShell.

Następnie sprawdź atrybut SID na elemencie.

Jeśli istnieje, pobierz wartość atrybutu i wstaw tę wartość do obiektu, a dla tego samego elementu pobierz drugi atrybut DISPLAYNAME i wstaw do tego samego obiektu. Stworzymy tablicę obiektów.

Wiem, że jestem daleko, ale mam nadzieję, że możesz pomóc.

+0

Czy możesz dodać więcej szczegółów? Czy na przykład wiesz, jak będzie wyglądać xml? Powershell pozwala na dostęp poprzez nazwę w tym przypadku, co znalazłem czyni kod znacznie łatwiejszy do odczytania – carlpett

Odpowiedz

11

Zastosowanie XPATH zamiast znaleźć wszystkie węzły z atrybutu SID tak:

$objs = @() 
$nodes = $userfile.SelectNodes("//*[@SID]") 
foreach ($node in $nodes) { 
    $sid = $node.attributes['SID'].value 
    $dispName = $node.attributes['DISPLAYNAME'].value 
    $obj = new-object psobject -prop @{SID=$sid;DISPNAME=$dispName} 
    $objs += $obj 
} 
$objs 

Oto przykład z wyjściem:

$xml = [xml]@" 
<doc> 
    <foo SID='foosid' DISPLAYNAME="foodisp"> 
    <bar SID='barsid' DISPLAYNAME="bardisp"/> 
    <baz> 
     <blech SID='blechsid' DISPLAYNAME="blechdisp"/> 
    </baz> 
    </foo> 
</doc> 
"@ 

$objs = @() 
$nodes = $xml.SelectNodes("//*[@SID]") 
foreach ($node in $nodes) { 
    $sid = $node.attributes['SID'].value 
    $dispName = $node.attributes['DISPLAYNAME'].value 
    $obj = new-object psobject -prop @{SID=$sid;DISPNAME=$dispName} 
    $objs += $obj 
} 
$objs 

Wyjścia:

SID      DISPNAME     
---      --------     
foosid     foodisp     
barsid     bardisp     
blechsid     blechdisp    
+0

Zakładam, że chcesz dodać instrukcję, która sprawdza, czy sid jest pusty przed utworzeniem wielu nowych obiektów obj puste, więc otrzymasz tablica objs, które są istotne. – Anicho

+0

Ponieważ XPATH określa, że ​​atrybut SID istnieje w elemencie, nie oczekiwałbym wartości pustej dla SID - być może pustego łańcucha. –

+0

masz rację, mówię tylko, żeby być skutecznym w tym, co przechowywane w pamięci. wygląda na to, że wyodrębniają dane użytkowników bazujących na reklamach, może być ich 1000, więc każdy obiekt zajmowałby X ilość pamięci, nawet jeśli przechowują 0 właściwości, to na razie zaoszczędzi trochę miejsca na dysku? – Anicho

2

Można również odwołaj się do węzłów podrzędnych podczas iteracji przez węzły podrzędne:

$j.LocalName (the name of the child element) 
$j.InnerXml (the Xml content of the child node) 
Powiązane problemy