Korábban láttuk, hogy a PowerShell képes XML formátumban exportálni objektumait. Nézzük, hogy hogyan lehet egyéb forrásból származó XML állományokkal dolgozni. Az első példámban egy nagyon egyszerű Access adatbázist exportáltam XML formátumba. Vigyázni kell, hogy megfelelő kódolású legyen az XML fájl, mert az ékezetes betűket UTF-8 kódolással nem fogja tudni értelmezni a PowerShell.
Az XML fájl tartalmát a következő kifejezéssel tudjuk változóba tölteni:
[9] PS C:\> $xml = [xml] (get-content c:\powershell2\munka\emberek.xml)
Ha megnézzük ennek az $xml változónak a tartalmát, akkor már nem a fájlban tárolt karaktersorozatot kapjuk vissza, hanem az XML adatformátumnak megfelelő adattartalmakat, és ebből a tulajdonságok kiolvasásához hasonló módon lehet az adatokat megkapni:
[22] PS C:\> $xml
xml root
--- ----
root
[23] PS C:\> $xml.root
xsd od schema dataroot
--- -- ------ --------
http://www.w3.o... urn:schemas-mic... schema dataroot
[24] PS C:\> $xml.root.dataroot
xsi generated Emberek Városok
--- --------- ------- -------
http://www.w3.o... 2008-08-10T08:3... {1, 2, 3} {1, 2}
[25] PS C:\> $xml.root.dataroot.emberek
ID Név Mellék VárosID
-- --- ------ -------
1 Soós Tibor 1234 1
2 Fájdalom Csilla 1230 1
3 Beléd Márton 1299 2
[26] PS C:\> $xml.root.dataroot.városok
ID Név
-- ---
1 Budapest
2 Debrecen
Vajon hogyan lehetne a „nyers” XML állománnyá visszaalakítani az $xml változónkat? Ebben az [XML] adattípus Save metódusa segíthet. Alapvetően ez a mentés fájlba irányulna, egy elérési utat vár paraméterként. Ha a képernyőre akarjuk kiíratni, akkor át kell verni, a mentés helyének a konzolt kell megadni a következő módon:
[26] PS C:\> $xml.save([console]::out)
<?xml version="1.0" encoding="ibm852"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-mic
rosoft-com:officedata">
<xsd:schema>
<xsd:element name="dataroot">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Emberek" minOccurs="0" maxOccurs="unbounded" />
...
A másik lehetőség, az XML típusú objektum OuterXML tulajdonságának lekérdezése, ez azonban nem ad ilyen szép, rendezett kimenetet:
[27] PS C:\> $xml.OuterXml
<?xml version="1.0" encoding="UTF-16"?><root xmlns:xsd="http://www.w3.org/2001
/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata"><xsd:schema><xsd:e
lement name="dataroot"><xsd:complexType><xsd:sequence><xsd:element ref="Embere
k" minOccurs="0" maxOccurs="unbounded" /><xsd:element ref="Városok" minOccurs=
"0" maxOccurs="unbounded" /></xsd:sequence><xsd:attribute name="generated" typ
e="xsd:dateTime" /></xsd:complexType></xsd:element><xsd:element name="Emberek"
><xsd:annotation><xsd:appinfo><od:index index-name="PrimaryKey" index-key="ID
" primary="yes" unique="yes" clustered="no" order="asc" /><od:index index-name
="VárosID" index-key="VárosID " primary="no" unique="no" clustered="no" order=
…
Az alábbi függvénnyel paraméterezhető módon tudjuk formázni az XML dokumentumokat. Az $indent paraméterrel meghatározhatjuk a beágyazott elemek behúzásának a mértékét:
function Format-XML ([xml]$xml, $indent=2) {
$StringWriter = New-Object System.IO.StringWriter
$XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter
$xmlWriter.Formatting = "indented"
$xmlWriter.Indentation = $Indent
$xml.WriteContentTo($XmlWriter)
$XmlWriter.Flush()
$StringWriter.Flush()
Write-Output $StringWriter.ToString()
}
Például 3 karakter szélességű behúzásnál a kimenet így néz ki:
PS C:\> $xml = [xml] (gc C:\Users\Tibi\Documents\Powershell5.docx_HTML\Powershe
ll5.docx_files\filelist.xml)
PS C:\> Format-XML -xml $xml -indent 3
<xml xmlns:o="urn:schemas-microsoft-com:office:office">
<o:MainFile HRef="../Powershell5.docx.htm" />
<o:File HRef="themedata.thmx" />
<o:File HRef="colorschememapping.xml" />
<o:File HRef="filelist.xml" />
</xml>