Problem Statement
Please take a look at this previous question of mine. I'm trying to achieve something similar to it, but this time with more advanced criteria.
Put simply, I need to add a child nodes (XML tags) under their parents <NETTOTAL>
. The child node text content consists of 8-digit numbers extracted from the same XML file. Those numbers are being extracted and stored in an array for later processing as you will see in the script below.
About the Script
The existing script works, but I suspect that the loop logic is wrong. I need it to pick and place one XML tag with it's corresponding 8-digit number under each parent, not pick, loop, and place the same exact child.
Original XML File Contents
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EXPORT>
<IMPORTMODEL>NEX</IMPORTMODEL>
<SESSION>1000061</SESSION>
<CUSTORDERS>
<RECORD CODE="NX0100103">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>97.40</NETTOTAL>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName1 lastName1 (43700006)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100104">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>38.20</NETTOTAL>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName2 lastName2 (43100015)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100105">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>63.00</NETTOTAL>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName3 lastName3 (43100014)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100106">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>55.00</NETTOTAL>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName2 lastName2 (43100015)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
</CUSTORDERS>
</EXPORT>
Desired Goal
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EXPORT>
<IMPORTMODEL>NEX</IMPORTMODEL>
<SESSION>1000061</SESSION>
<CUSTORDERS>
<RECORD CODE="NX0100103">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>97.40</NETTOTAL>
<SALESMAN>43700006</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName1 lastName1 (43700006)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100104">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>38.20</NETTOTAL>
<SALESMAN>43100015</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName2 lastName2 (43100015)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100105">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>63.00</NETTOTAL>
<SALESMAN>43100014</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName3 lastName3 (43100014)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100106">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>55.00</NETTOTAL>
<SALESMAN>43100015</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName2 lastName2 (43100015)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
</CUSTORDERS>
</EXPORT>
Script
$xmlFilesLocation = "C:\XML_dumping"
cd $xmlFilesLocation
$netTotalRegEx = "(<NETTOTAL>\d{1,30}\.\d{1,2}<\/NETTOTAL>)"
$salesManRegEx = "(<SALESMAN>\d{8}<\/SALESMAN>)"
$beginTag = "`t`t`t<SALESMAN>"
$endTag = "</SALESMAN>"
$files = Get-ChildItem -Path $xmlFilesLocation -Filter *.xml
$numberOfFiles = (Get-ChildItem -Path $xmlFilesLocation -Filter *.xml | Measure-Object).Count
# First, loop through all files separately to check if <SALESMAN>[code]</SALESMAN> exists, and skip if true
for ($i=1; $i -le $numberOfFiles; $i++) {
$content = (Get-Content $files[$i - 1] -Raw)
# Skip file if <SALESMAN>[code]</SALESMAN> is detected in it
if ($content -match $salesManRegEx) { break }
}
# Then, loop through all files (again) separately to check if <SALESMAN>[code]</SALESMAN> is missing, and process if true
for ($j=1; $j -le $numberOfFiles; $j++) {
$content = (Get-Content $files[$j - 1] -Raw)
# If <SALESMAN>[code]</SALESMAN> is missing in the file
if ($content -notmatch $salesManRegEx) {
$contentArray = @()
# Hold all the content, but split from the brackets
$contentArray = $content
$contentArray = $contentArray.Split("()")
# Now split by line to extract the salesman codes into an array.
# Example: [43700006, 43100015, 43100014, 43100015]
$contentArray = $contentArray.Split("")
for ($k=1; $k -le $contentArray.Length; $k++) {
# if the salesman code is found...
if ($contentArray[$k] -match "^\d{8}$") {
if ($content -notmatch $salesManRegEx) {
# Construct the full tag
$fullSalesManTag = $beginTag + $contentArray[$k] + $endTag
# ...then replace in $content the regular expression with $fullSalesManTag and insert it directly underneath NETTOTAL line
$content= [regex]::Replace($content, $netTotalRegEx, ('$1' + "`n" + "$fullSalesManTag"))
$content | Out-File -Encoding UTF8 $files[$j - 1]
}
}
}
}
}
Current Output
The output is clearly showing that it's only adding the last element in the array index. That's when the loop has ended. I understand why this is happening, but I can't wrap my head around a solution to correct the logic.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EXPORT>
<IMPORTMODEL>NEX</IMPORTMODEL>
<SESSION>1000061</SESSION>
<CUSTORDERS>
<RECORD CODE="NX0100103">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>97.40</NETTOTAL>
<SALESMAN>43700006</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName1 lastName1 (43700006)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100104">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>38.20</NETTOTAL>
<SALESMAN>43700006</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName2 lastName2 (43100015)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100105">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>63.00</NETTOTAL>
<SALESMAN>43700006</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName3 lastName3 (43100014)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
<RECORD CODE="NX0100106">
<VATMODE>X</VATMODE>
<INPUTDATE>26/07/2017</INPUTDATE>
<NETTOTAL>55.00</NETTOTAL>
<SALESMAN>43700006</SALESMAN>
<DOCLINES>
<LINE>
<LINETYPE>M</LINETYPE>
<ITEMDESC>Salesperson: firstName2 lastName2 (43100015)</ITEMDESC>
</LINE>
</DOCLINES>
</RECORD>
</CUSTORDERS>
</EXPORT>