web-dev-qa-db-fra.com

Parcourez les éléments xml

J'ai ce qui suit:

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

J'essaie de comprendre comment parcourir chaque élément de PowerShell.

Recherchez ensuite un attribut SID sur l'élément.

S'il existe, obtenez la valeur d'attribut et mettez cette valeur dans un objet et pour le même élément, saisissez le deuxième attribut DISPLAYNAME et placez-le dans le même objet. Nous allons créer un tableau d'objets.

Je sais que je suis loin mais j'espère que vous pourrez m'aider.

13
adean

Utilisez plutôt XPATH pour trouver tous les nœuds avec un attribut SID comme ceci:

$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

Voici un exemple avec sortie:

$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

Les sorties:

SID                       DISPNAME                
---                       --------                
foosid                    foodisp                 
barsid                    bardisp                 
blechsid                  blechdisp               
15
Keith Hill

Vous pouvez également référencer les nœuds enfants lorsque vous parcourez les nœuds childNodes:

$j.LocalName (the name of the child element)
$j.InnerXml  (the Xml content of the child node)
5
Brandon Hawbaker