XML csomópontok módosítása

Az eddigiekben az XML adatokat csak lekérdeztük, de nem módosítottuk. Ebben a fejezetben tekintsük át a módosítási lehetőségeket is. Ezekre nincsen natív PowerShell cmdlet, hanem az XML objektum különböző metódusait használhatjuk erre a célra.

Az XML adatstruktúrába új elem felvételét az XML dokumentum (maga az XML objektum) szintjén található CreateElement metódussal végezhetjük el. Fontos, hogy ez az elem még nem lesz befűzve az XML hierarchiába, hanem csak a metódus visszatérési értékeként megkapjuk ezt az objektumot, de a beillesztésről nekünk kell egy újabb metódus felhasználásával gondoskodnunk. Fontos továbbá, hogy ez a visszakapott befűzendő elem kötődik ahhoz az XML dokumentumhoz, amely segítségével létrehoztuk, azaz nem lehet egy másik XML objektumba beilleszteni.

Nézzük tehát, hogy az eddigi gyümölcseimhez hogyan adhatok hozzá egy újabbat, a dinnyét! Elsőként definiálok egy új gyümölcsöt az $x XML objektumból kiindulva:

[2] PS C:\> $new = $x.CreateElement("gyümölcs")

[3] PS C:\> $new

 

 

Name            : gyümölcs

LocalName       : gyümölcs

NamespaceURI    :

Prefix          :

NodeType        : Element

ParentNode      :

OwnerDocument   : #document

IsEmpty         : True

Attributes      : {}

HasAttributes   : False

SchemaInfo      : System.Xml.XmlName

InnerXml        :

InnerText       :

NextSibling     :

PreviousSibling :

Value           :

ChildNodes      : {}

FirstChild      :

LastChild       :

HasChildNodes   : False

IsReadOnly      : False

OuterXml        : <gyümölcs />

BaseURI         :

Ez a gyümölcs azonban még semmi tulajdonsággal nem rendelkezik, se fajtája, se ára nincsen, és még be sincs fűzve az XML hierarchiába. Én ebben a gyümölcsábrázoló $x objektumomban ezeket a jellegzetességeket nem attribútumként, hanem elemként vettem fel, így ezeket is külön definiálnom kell:

[4] PS C:\> $fajta = $x.CreateElement("fajta")

[5] PS C:\> $ár = $x.CreateElement("ár")

[6] PS C:\> $szín = $x.CreateElement("szín")

[7] PS C:\> $new.AppendChild($fajta)

 

 

Name            : fajta

LocalName       : fajta

NamespaceURI    :

 

[8] PS C:\> $new.AppendChild($szín)

 

 

Name            : szín

LocalName       : szín

NamespaceURI    :

 

 

 

[9] PS C:\> $new.AppendChild($ár)

 

 

Name            : ár

LocalName       : ár

Minden AppendChild ad kimenetet is, ezeket most a helytakarékosság okán kicsit megvágtam. A $new elemem kezd formálódni, már van helye az adatok megadásának:

[10] PS C:\> $new

 

fajta                      szín                      ár

-----                      ----                      --

 

Amit egyszerűen meg is tehetek már:

[11] PS C:\> $new.fajta = "dinnye"

[12] PS C:\> $new.szín = "zöld"

[13] PS C:\> $new.ár = 114

Cannot set "ár" because only strings can be used as values to set XmlNode prop

erties.

At line:1 char:6

+ $new. <<<< ár = 114

    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException

    + FullyQualifiedErrorId : PropertyAssignmentException

Természetesen az ár is, mint minden más szövegként ábrázolódik az XML-ben, ezért kaptam hibajelzést ennek feltöltésekor. Így már jó lesz:

[14] PS C:\> $new.ár = "114"

[15] PS C:\> $new

 

fajta                      szín                      ár

-----                      ----                      --

dinnye                     zöld                      114

Most már csak be kell fűzni az elkészült gyümölcsöt a helyére, a ’gyümölcsök’ csomópont alá:

[16] PS C:\> $x.gyümölcsök.AppendChild($new)

 

fajta                      szín                      ár

-----                      ----                      --

dinnye                     zöld                      114

És most már a dinnyénk is ott mosolyog a többi gyümölcs között:

[17] PS C:\> $x.gyümölcsök.gyümölcs

 

adat                fajta               szín                ár

----                -----               ----                --

valami              körte               sárga               210

                    alma                piros               180

                    szőlő               kék                 600

                    barack              piros-sárga         330

                    dinnye              zöld                114

Ha valamilyen attribútumot szeretnénk adni valamelyik elemünkhöz, azt a SetAttribute metódussal tehetjük meg:

[18] PS C:\> $new.SetAttribute("adat","sima")

[19] PS C:\> $x.gyümölcsök.gyümölcs

 

adat                fajta               szín                ár

----                -----               ----                --

valami              körte               sárga               210

                    alma                piros               180

                    szőlő               kék                 600

                    barack              piros-sárga         330

sima                dinnye              zöld                114

Látható, hogy én a $new-nak adtam attribútumot, mégis az $x-en keresztül is látszik. Ennek oka, hogy itt végig referenciák átadása történt az értékadásoknál, azaz ezek a változók szoros szimbiózisban élnek egymással.



Word To HTML Converter