Замена узлов XML в PowerShell - PullRequest
       3

Замена узлов XML в PowerShell

6 голосов
/ 19 марта 2011

У меня есть два 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>

Я хочувзять элемент с GUIDx в File1.xml и заменить его на item на GUIDx из File2.xml.По сути, я хочу взять замещающий текст в File2.xml и вставить его в соответствующий узел item в File1.xml

Как мне это сделать в PowerShell?

1 Ответ

5 голосов
/ 19 марта 2011

Предположим, у меня есть первый xml в переменной $edited, а второй в $new. Затем вы можете изменить значение в элементе с идентификатором 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 }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...