Bagaimana cara memodifikasi / membuat nilai dalam file XML menggunakan PowerShell?

24

Saya ingin tahu apakah mungkin mengubah / membuat nilai dalam file XML menggunakan PowerShell. Pada dasarnya saya tertarik pada:

  • Ubah nilai dalam file XML atau buat jika tidak ada (mis. Saya perlu mencari item, buat jika tidak ada, dan ubah nilainya)
  • Berurusan dengan sintaks XML yang berbeda dalam file XML yang sama seperti yang:

Sintaks 1:

<pengaturan>
  <setting id = "Location2" value = "Barcelona, ​​Spanyol" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</settings>

Sintaks 2:

<pengaturan>
    <musikplayer>
        <crossfade> 0 </crossfade>
        <queuebydefault> false </queuebydefault>
    </musicplayer>
</settings>

Sintaks 3:

<pengaturan>
    <skinsettings>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </skinsettings>
</settings>

Bantuan apapun akan sangat dihargai.

Terima kasih.

Serieofilo
sumber

Jawaban:

36

PowerShell sepenuhnya mendukung penanganan file XML.

Misalnya, jika kami mengambil uraian pertama yang Anda berikan dan hanya menempelkannya ke file XML bernama settings.xmldi folder "C: \ blah", Anda bisa mendapatkan ID dari setiap pengaturan seperti itu:

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

Yang mengembalikan:

Location2
Location2id

Dan

$myXML.settings.setting.value

pengembalian:

Barcelona, Spain
zmw:00000.1.08181

Jika kami mengganti konten file XML dengan uraian yang Anda berikan di Sintaks # 2:

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

pengembalian:

0

Untuk membaca crossfade, ubah (menjadi 2), dan simpan kembali:

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

Edit setelah komentar:

Untuk mengubah elemen XML itu sendiri (seperti dalam contoh Barcelona) sedikit lebih rumit, karena Anda mengedit struktur XML itu sendiri, bukan data yang dikandungnya.

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

Sebagai contoh Skinsettings, coba sesuatu seperti:

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

Lihat sumber daya ini:

Ƭᴇcʜιᴇ007
sumber
Terima kasih atas jawabannya. Saya telah membaca saran Anda dan saya mencoba memperbarui nilai id = "Location2" di gumpalan pertama dari Barcelona ke New York tanpa hasil. Sama dengan gumpalan ketiga (mencoba mengubah ke "true"). Bagaimana saya bisa menemukan / memodifikasi nilai-nilai ini?
Serieofilo
Saya mencoba memilih simpul yang ingin saya ubah menggunakan yang berikut $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']"), tetapi, bagaimana saya bisa mengubah nilai dari "false" menjadi "true". Atau bagaimana saya bisa membuat simpul seperti ini jika tidak ada?
Serieofilo
1
Lihat hasil edit saya. Saya menambahkan beberapa info lagi. :)
Ƭᴇcʜιᴇ007