Як змінити / створити значення у файлах XML за допомогою PowerShell?


24

Мені хотілося б знати, чи можна змінювати / створювати значення в XML-файлах за допомогою PowerShell. В основному мене цікавить:

  • Змініть значення у файлі XML або створіть їх, якщо вони не існують (тобто мені потрібно шукати елемент, створити, якщо його немає, і змінити значення)
  • Робота з різними синтаксисами XML у тому самому файлі XML, як ці:

Синтаксис 1:

<налаштування>
  <налаштування id = "Location2" value = "Барселона, Іспанія" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</settings>

Синтаксис 2:

<налаштування>
    <музичний гравець>
        <crossfade> 0 </crossfade>
        <queuebydefault> false </queuebydefault>
    </musicplayer>
</settings>

Синтаксис 3:

<налаштування>
    <встановлення>
        <налаштування типу = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </skinsettings>
</settings>

Будь-яка допомога буде дуже вдячна.

Спасибі.

Відповіді:


36

PowerShell повністю підтримує роботу з XML-файлами.

Наприклад, якщо ми візьмемо перше додане вами розмиття і просто вставимо його у XML-файл, названий settings.xmlу папці "C: \ blah", ви можете отримати ідентифікатор кожного параметра як такого:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.setting.id

Що повертає:

Location2
Location2id

І

$myXML.settings.setting.value

повертає:

Barcelona, Spain
zmw:00000.1.08181

Якщо ми замінимо вміст файлу XML розмиттям, яке ви вказали в Синтаксисі №2:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.musicplayer.crossfade

повертає:

0

Щоб прочитати crossfade, змініть його (на 2) та збережіть назад:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.musicplayer.crossfade = 2
$myXML.Save("C:\blah\settings.xml")

Редагувати після коментарів:

Змінювати самі елементи XML (як у прикладі Барселони) трохи складніше, оскільки ви редагуєте саму структуру XML, а не дані, які вона містить.

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.ChildNodes.Item(0).value = "New York, USA"
$myXML.Save("C:\blah\settings.xml")

Для прикладу Skinsettings спробуйте щось на кшталт:

$myXML.settings.skinsettings.setting."#text" = "true"

Перевірте ці ресурси:


Дякую за відповідь. Я читав ваші пропозиції, і я намагаюся оновити значення id = "Location2" у першій краплі від Барселони до Нью-Йорка без успіху. Те ж саме з третім блобом (намагається змінити на "справжній"). Як я можу знайти / змінити ці значення?
Serieofilo

Я намагаюся вибрати вузол, який я хочу змінити, використовуючи наступне, $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']")але як я можу змінити значення з "false" на "true". Або як я можу створити такий вузол, якщо його немає?
Serieofilo

1
Ознайомтесь із моєю редакцією. Я додав ще трохи інформації. :)
Ƭᴇcʜιᴇ007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.