Reputation: 171
I have the following:
$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
}
I am trying to figure out how to loop through each element within powershell.
Then check for an attribute of SID on the element.
If exists get attribute value and put that value into an object and for the same element grab second attribute DISPLAYNAME and place into same object. We will create an array of objects.
I know I am way off but hope you can help.
Upvotes: 17
Views: 93498
Reputation: 554
You can also reference the child nodes when you are iterating through the childNodes:
$j.LocalName (the name of the child element)
$j.InnerXml (the Xml content of the child node)
Upvotes: 5
Reputation: 201652
Use XPATH instead to find all nodes with a SID attribute like so:
$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
Here's an example with output:
$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
Outputs:
SID DISPNAME
--- --------
foosid foodisp
barsid bardisp
blechsid blechdisp
Upvotes: 23