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.