问题
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.
回答1:
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
回答2:
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)
来源:https://stackoverflow.com/questions/13732715/loop-through-xml-elements