微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在PowerShell中替换XML节点

我有两个 XML文件(File1.xml,File2.xml). File2.xml是File1.xml的子集.

File1.xml有这样的节点:

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

File2.xml有:

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

我想在File1.xml中使用带有GUIDx的项目,并将其替换为来自File2.xml的GUIDx项目.本质上,我想在File2.xml中获取替换文本并将其插入File1.xml中的相应项目节点

我如何在PowerShell中执行此操作?

解决方法

假设我在变量$edited中有第一个xml,在$new中有第二个.然后,您可以通过ID更改ID为GUID1的项目中的值

$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

如果您有更多要替换的项目,可以使用嵌套管道:

$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 }
    }

或foreach循环,这里更具可读性:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。