XML adatok beolvasása

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 elemekem 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>



Word To HTML Converter