开发者

Replacing XML nodes in PowerShell

开发者 https://www.devze.com 2023-02-18 06:24 出处:网络
I have two XML files (File1.xml, File2.xml). File2.xml is a subset of File1.xml. File1.xml has nodes like so:

I have two XML files (File1.xml, File2.xml). File2.xml is a subset of File1.xml.

File1.xml has nodes like so:

<parentnode>
    <item id="GUID1">
         <Text>Some Text</Text> 
    </item>
    <item id="GUID2">
        <Text>Here’s some more text</Text> 
    </item>
</parentnode>

F开发者_如何学JAVAile2.xml has:

<parentnode>
    <item id="GUID1">
         <Text>Some Replacement Text</Text> 
    </item>
</parentnode>

I want to take the item with GUIDx in File1.xml, and replace it with the item with GUIDx from File2.xml. Essentially, I want to take the replacement text in File2.xml and insert it into the corresponding item node in File1.xml

How do I do this in PowerShell?


Suppose I have first xml in variable $edited and the second in $new. Then you can change value in item with id GUID1 via

$edited.parentnode.item | 
   ? { $_.id -eq 'guid1' } | 
   % { $_.Text = $new.parentnode.item.Text }
# and save the file
$edited.Save('d:\File1.xml')
# see the changes
gc d:\File1.xml

In case you have more items to replace, you could use nested pipelines:

$edited = [xml]@"
<parentnode>
    <item id="GUID1"><Text>Some Text</Text></item>
    <item id="GUID2"><Text>Here’s some more text</Text></item>
    <item id="GUID3"><Text>Here’s some more text</Text></item>
    <item id="GUID10"><Text>Here’s some more text</Text></item>
</parentnode>
"@
$new = [xml] @"
<parentnode>
    <item id="GUID1"><Text>new Guid1</Text></item>
    <item id="GUID2"><Text>new Guid2</Text></item>
    <item id="GUID3"><Text>new Guid3</Text></item>
    <item id="GUID4"><Text>new Guid4</Text></item>
    <item id="GUID5"><Text>new Guid5</Text></item>
</parentnode>
"@
$new.parentnode.item | 
    % { ,($_.id,$_.Text)} | 
    % { $id,$text = $_; 
        $edited.parentnode.item | 
           ? { $_.id -eq $id } | 
           % { $_.Text = $text }
    }

or foreach cycle which is more readable here:

foreach($i in $new.parentnode.item) { 
    $edited.parentnode.item | 
           ? { $_.id -eq $i.Id } | 
           % { $_.Text = $i.Text }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消