[xml]$xml = @"
<?xml version="1.0" encoding="UTF-8"?>
<root>
<elementLevel1>
<elementLevel2>text node 1</elementLevel2>
<elementLevel2>text node 2</elementLevel2>
<elementLevel2>text node 3</elementLevel2>
<elementLevel2>text node 4</elementLevel2>
</elementLevel1>
<elementLevel1>
<elementLevel2>text node 1</elementLevel2>
<elementLevel2>text node 2</elementLevel2>
<elementLevel2>text node 3</elementLevel2>
<elementLevel2>text node 4</elementLevel2>
</elementLevel1>
</root>
"@
foreach($level1 in $xml.root.elementLevel1)
{
Write-Host("Type of elementLevel1: " + $level1.GetType())
Write-Host("Type of elementLevel2 in outer loop: " + $level1.elementLevel2.GetType())
foreach($level2 in $level1.elementLevel2)
{
Write-Host("Type of elementLevel2 in inner loop: " + $level2.GetType())
}
}
Yields:
Type of elementLevel1: System.Xml.XmlElement
Type of elementLevel2 in outer loop: System.Object[]
Type of elementLevel2 in inner loop: string
Type of elementLevel2 in inner loop: string
Type of elementLevel2 in inner loop: string
Type of elementLevel2 in inner loop: string
Type of elementLevel1: System.Xml.XmlElement
Type of elementLevel2 in outer loop: System.Object[]
Type of elementLevel2 in inner loop: string
Type of elementLevel2 in inner loop: string
Type of elementLevel2 in inner loop: string
Type of elementLevel2 in inner loop: string
My ultimate goal is to change the text node of each elementLevel2, but you can't modify the InnerXml property of a string and you can't cast a string to a [System.Xml.XmlElement]. How can I coerce the type system to think elementLevel2 is an XmlElement?