วิธีแก้ไข / สร้างค่าในไฟล์ XML โดยใช้ PowerShell


24

ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะแก้ไข / สร้างค่าในไฟล์ XML โดยใช้ PowerShell โดยทั่วไปฉันสนใจ:

  • แก้ไขค่าในไฟล์ XML หรือสร้างค่าหากไม่มีอยู่ (เช่นฉันต้องการค้นหารายการสร้างถ้าไม่มีอยู่และแก้ไขค่า)
  • จัดการกับไวยากรณ์ XML ที่แตกต่างกันในไฟล์ XML เดียวกันกับไฟล์เหล่านั้น:

ไวยากรณ์ 1:

<การตั้งค่า>
  <setting id = "Location2" value = "Barcelona, ​​Spain" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</ การตั้งค่า>

ไวยากรณ์ 2:

<การตั้งค่า>
    <musicplayer>
        <Crossfade> 0 </ Crossfade>
        <queuebydefault> เท็จ </ queuebydefault>
    </ musicplayer>
</ การตั้งค่า>

ไวยากรณ์ 3:

<การตั้งค่า>
    <skinsettings>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </ skinsettings>
</ การตั้งค่า>

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก

ขอบคุณ

คำตอบ:


36

PowerShell รองรับการจัดการไฟล์ XML อย่างสมบูรณ์

ตัวอย่างเช่นหากเราทำการประกาศแจ้งครั้งแรกที่คุณให้มาและวางลงในไฟล์ XML ชื่อsettings.xmlในโฟลเดอร์ "C: \ blah" คุณจะได้รับ ID ของการตั้งค่าแต่ละรายการดังนี้:

[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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.