Come modificare / creare valori nei file XML usando PowerShell?


24

Vorrei sapere se è possibile modificare / creare valori nei file XML usando PowerShell. Fondamentalmente sono interessato a:

  • Modifica i valori nel file XML o creali se non esistono (cioè devo cercare l'elemento, creare se non esiste e modificare il valore)
  • Gestisci sintassi XML diverse nello stesso file XML come quelli:

Sintassi 1:

<Impostazioni>
  <setting id = "Location2" value = "Barcellona, ​​Spagna" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</ Impostazioni>

Sintassi 2:

<Impostazioni>
    <Musicplayer>
        <Crossfade> 0 </ crossfade>
        <Queuebydefault> false </ queuebydefault>
    </ Musicplayer>
</ Impostazioni>

Sintassi 3:

<Impostazioni>
    <Skinsettings>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </ Skinsettings>
</ Impostazioni>

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie.

Risposte:


36

PowerShell supporta completamente la gestione dei file XML.

Ad esempio, se prendiamo il primo blurb che hai fornito e lo incolliamo semplicemente in un file XML chiamato settings.xmlnella cartella "C: \ blah", potresti ottenere l'ID di ogni impostazione come tale:

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

Che ritorna:

Location2
Location2id

E

$myXML.settings.setting.value

ritorna:

Barcelona, Spain
zmw:00000.1.08181

Se sostituiamo il contenuto del file XML con il blurb che hai fornito in Sintassi # 2:

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

ritorna:

0

Per leggere crossfade, cambiarlo (in 2) e salvare di nuovo:

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

Modifica dopo i commenti:

Modificare gli elementi XML stessi (come nell'esempio di Barcellona) è un po 'più complicato, perché stai modificando la struttura XML stessa, non i dati che contiene.

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

Per l'esempio di Skinsettings, prova qualcosa del tipo:

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

Dai un'occhiata a queste risorse:


Grazie per la risposta. Ho letto i tuoi suggerimenti e sto cercando di aggiornare il valore di id = "Location2" nel primo BLOB da Barcellona a New York senza successo. Lo stesso con il terzo BLOB (cercando di passare a "vero"). Come posso trovare / modificare questi tipi di valori?
Serieofilo

Sto provando a selezionare il nodo che voglio cambiare usando quanto segue $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']")ma, come posso cambiare il valore da "false" a "true". O come posso creare un nodo come questo se non esiste?
Serieofilo

1
Dai un'occhiata alla mia modifica. Ho aggiunto qualche informazione in più. :)
Ƭᴇcʜιᴇ007
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.