Как я могу переименовать узел XML с помощью PowerShell? - PullRequest
6 голосов
/ 15 июня 2011

Я пытаюсь переименовать узел XML с помощью PowerShell. Например:
<configuration>
<desktops>
<name>PC001</name>
<domain>CORP</domain>
</desktops>
<laptops>
<name>PC002</name>
<domain>CORP</domain>
</laptops>
</configuration>

Я хочу переименовать первые <name> теги в <PC1name></PC1name> соответственно). Вот что у меня есть, пока:

$InputFile = "NetworkConfigs.xml"
$xml = [xml](get-content $InputFile)
$root = $xml.get_DocumentElement();
#replace the node
$ root.desktops.name.? `

$xml.Save($InputFile)

Я не знаю, как заменить метку чем-то другим. Советы?

Ответы [ 3 ]

8 голосов
/ 15 июня 2011

Итог, имя узла XML является неизменным. Ссылка MSDN .

Вот краткий пример создания нового узла с необходимыми данными. Надеюсь, поможет.

$InputText = @"
<configuration>
<desktops>
<name>PC001</name>
<domain>CORP</domain>
</desktops>
<laptops>
<name>PC002</name>
<domain>CORP</domain>
</laptops>
</configuration>
"@

$xml = [xml]($inputText)
$desktopsNode = [System.Xml.XmlElement]$xml.configuration.desktops
$nameNode = $desktopsNode.SelectSingleNode('name')
$pcNameNode = $xml.CreateElement('PC1Name')
$pcNameNode.InnerText = $nameNode.InnerText
[void]$desktopsNode.AppendChild($pcNameNode)
[void]$desktopsNode.RemoveChild($nameNode)
$xml.OuterXML

Выход:

<configuration><desktops><domain>CORP</domain><PC1Name>PC001</PC1Name></desktops><laptops><name>PC002</n
ame><domain>CORP</domain></laptops></configuration>
3 голосов
/ 11 декабря 2012

Переименование узлов в XML сложнее, чем вы могли ожидать.Это особенно плохо, если узел является корневым узлом или родительским со сложной иерархией дочерних узлов.Большинство методов «переименования», которые я видел, клонируют детей и добавляют их в новый узел.Этот процесс становится немного проще, если ваш API также включает метод ReplaceChild.(Я могу предоставить подробности, если они вам нужны.)

Альтернативный метод, который я использовал (особенно если XML можно представить в виде строки), состоит в замене текста в XML перед преобразованием его в XmlDocument.

$InputText = @"
<configuration>
<desktops>
<name>PC001</name>
<domain>CORP</domain>
</desktops>
<laptops>
<name>PC002</name>
<domain>CORP</domain>
</laptops>
</configuration>
"@

$regex = [regex]'(</?)name>'
$ModifiedText = $regex.Replace($InputText,"`$1PC1Name>",2)
$xml = [xml]$ModifiedText

Обратите внимание, что оператор replace находит и исправляет первые 2 вхождения совпадения - открывающий и закрывающий тег только для первого элемента.Удалите номер, чтобы найти и заменить все вхождения в строке.Также обратите внимание, что регулярное выражение захватывает символы открывающего тега, так что они могут быть вставлены в совпадение строки как $ 1.

1 голос
/ 09 декабря 2013
$oldtag = "name"
$newtag = "PC1name"
$xml = Get-Content D:\oldfile.xml
$new = $xml -replace $oldtag, $newtag
Set-content -path D:\newfile.xml -value $new

Мой способ - я преобразовываю XML в строку, а затем заменяю узел (который в данном случае является просто обычной строкой). Меня устраивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...