2
[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?

1 Answer 1

3

You coud use SelectNodes with a xpath to select your nodes and iterate over it:

$lvl2Elements = $xml.SelectNodes("//root/elementLevel1/elementLevel2")

foreach($element in $lvl2Elements)
{    
    $element.'#text' = 'Test'
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, that gets me out of my jam.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.