Как изменить / создать значения в файлах XML с помощью PowerShell?

24

Я хотел бы знать, возможно ли изменить / создать значения в файлах XML с помощью PowerShell. В основном я заинтересован в:

  • Измените значения в файле XML или создайте их, если они не существуют (т.е. мне нужно найти элемент, создать, если он не существует и изменить значение)
  • Обращайтесь с другим синтаксисом XML в одном и том же XML-файле, например:

Синтаксис 1:

<Настройки>
  <setting id = "Location2" value = "Барселона, Испания" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</ Настройки>

Синтаксис 2:

<Настройки>
    <MusicPlayer>
        <Склейка> 0 </ склейка>
        <Queuebydefault> ложь </ queuebydefault>
    </ MusicPlayer>
</ Настройки>

Синтаксис 3:

<Настройки>
    <Skinsettings>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </ setting>
    </ Skinsettings>
</ Настройки>

Любая помощь будет принята с благодарностью.

Благодарю.

Serieofilo
источник

Ответы:

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"

Проверьте эти ресурсы:

Ƭᴇcʜιᴇ007
источник
Спасибо за ответ. Я прочитал ваши предложения и безуспешно пытаюсь обновить значение id = "Location2" в первом блобе из Барселоны в Нью-Йорк. То же самое с третьим блобом (пытаюсь изменить на «истина»). Как я могу найти / изменить эти виды значений?
Serieofilo
Я пытаюсь выбрать узел, который я хочу изменить, используя следующее, $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']")но как я могу изменить значение с «ложь» на «истина». Или как я могу создать такой узел, если он не существует?
Serieofilo
1
Проверьте мои изменения. Я добавил еще немного информации. :)
Ƭᴇcʜιᴇ007