This script allows to parse an XML file.
In this example, the XML must be named config.xml and must be located in the same folder as the script.
The variable $PSScriptRoot is used to retrieve the path where the script is launched.
1. Parsing XML – Single Tags and recursively
Let’s create an XML file named “config.xml” in the same location as the script with the following content:
<?xml version="1.0" ?> <Configuration> <Instrument>Guitare</Instrument> <Item ID="1"> <Manufacturer>Fender</Manufacturer> <Model>Stratocaster</Model> <Color>Red</Color> </Item> <Item ID="2"> <Manufacturer>Gibson</Manufacturer> <Model>Les Paul</Model> <Color>Black</Color> </Item> </Configuration>
The following script allows to parse the XML:
##*=============================================== ##* LOADING XML FILE ##*=============================================== $xml = [xml](Get-Content "$PSScriptRoot\config.xml") ##*=============================================== ##* RETRIEVING A SINGLE TAG ##*=============================================== $Instru = $xml.Configuration.Instrument Write-Host "" Write-Host "The value of the Instrument tag is $Instru" ##*=============================================== ##* RETRIEVING A SINGLE BLOCK : ITEM ID=1 ##*=============================================== $Manufacturer = $xml.Configuration.Item | Where-Object {$_.ID -eq '1'} | Select-Object Manufacturer $Manufacturer = $Manufacturer.Manufacturer $Model = $xml.Configuration.Item | Where-Object {$_.ID -eq '1'} | Select-Object Model $Model = $Model.Model $Color = $xml.Configuration.Item | Where-Object {$_.ID -eq '1'} | Select-Object Color $Color = $Color.Color Write-Host "" Write-Host "Retrieving values of Item where ID=1" Write-Host "The manufacturer is $Manufacturer" Write-Host "The model is $Model" Write-Host "The color is $Color" ##*=============================================== ##* RETRIEVING ALL BLOCKS WITH A LOOP ##*=============================================== Write-Host "" Write-Host "Retrieving values of all Items" ForEach ($Item in $xml.Configuration.Item) { $ItemId = $Item.ID Write-Host "Retrieving Item where ID=$ItemId" $Manufacturer = $xml.Configuration.Item | Where-Object {$_.ID -eq $ItemId} | Select-Object Manufacturer $Manufacturer = $Manufacturer.Manufacturer $Model = $xml.Configuration.Item | Where-Object {$_.ID -eq $ItemId} | Select-Object Model $Model = $Model.Model $Color = $xml.Configuration.Item | Where-Object {$_.ID -eq $ItemId} | Select-Object Color $Color = $Color.Color Write-Host "The manufacturer is $Manufacturer" Write-Host "The model is $Model" Write-Host "The color is $Color" } ##*=============================================== ##* CHECKING DUPLICATE ITEM ID ##*=============================================== Write-Host "" Write-Host "Check duplicate ID in XML" $duplicate=0 For([int] $i=0;$i -lt $xml.Configuration.Item.count;$i++) { For([int] $j=$i+1;$j -lt $xml.Configuration.Item.count;$j++) { If($xml.Configuration.Item[$i].id -eq $xml.Configuration.Item[$j].id) { $duplicate=1 } } } If ($duplicate -eq 0) { Write-Host "OK - no duplicate Item ID in XML" } Else { Write-Host "Error - Duplicate Item ID found in XML" }
2. Parsing XML – Looping a Loop
The goal here is to retrieve data of a loop inside another loop.
Let’s create an XML file named “config.xml” with the following content:
<?xml version="1.0" ?> <Configuration> <COUNTRY NAME="SWITZERLAND"> <Place ID="1"> <City>Geneva</City> <NbUsers>120</NbUsers> <NbMachines>150</NbMachines> </Place> <Place ID="2"> <City>Lausanne</City> <NbUsers>50</NbUsers> <NbMachines>75</NbMachines> </Place> </COUNTRY> <COUNTRY NAME="FRANCE"> <Place ID="1"> <City>Paris</City> <NbUsers>100</NbUsers> <NbMachines>110</NbMachines> </Place> <Place ID="2"> <City>Lille</City> <NbUsers>20</NbUsers> <NbMachines>25</NbMachines> </Place> <Place ID="3"> <City>Dunkerque</City> <NbUsers>2</NbUsers> <NbMachines>3</NbMachines> </Place> </COUNTRY> <COUNTRY NAME="USA"> <Place ID="1"> <City>New-York</City> <NbUsers>200</NbUsers> <NbMachines>400</NbMachines> </Place> <Place ID="2"> <City>Boston</City> <NbUsers>150</NbUsers> <NbMachines>180</NbMachines> </Place> </COUNTRY> </Configuration>
The following script allows to parse the XML, retrieving dynamically the data using 2 loops.
##*=============================================== ##* LOADING XML FILE ##*=============================================== $xml = [xml](Get-Content "$PSScriptRoot\config.xml") ##*=============================================== ##* LOOPING A LOOP ##*=============================================== ForEach ($COUNTRY in $xml.Configuration.COUNTRY) { $COUNTRYNAME = $COUNTRY.NAME Write-Host "$COUNTRYNAME" Write-Host "" $WaveCount = $SOE.Wave.count ForEach ($Place in $COUNTRY.Place) { $PlaceID = $Place.ID $City = $COUNTRY.Place | Where-Object {$_.ID -eq $PlaceID} | Select-Object City $City = $City.City Write-Host "Place $PlaceID is $City" $NbUsers = $COUNTRY.Place | Where-Object {$_.ID -eq $PlaceID} | Select-Object NbUsers $NbUsers = $NbUsers.NbUsers Write-Host "NbUsers is $NbUsers" $NbMachines = $COUNTRY.Place | Where-Object {$_.ID -eq $PlaceID} | Select-Object NbMachines $NbMachines = $NbMachines.NbMachines Write-Host "NbMachines is $NbMachines" Write-Host "" } Write-Host "" }