XML névterek

Az XML névterek elég sok fejfájást okoztak nekem, amikor először találkoztam a jelenséggel. Nézzük, mi is ez! Gyakran az alábbiakhoz hasonló szerkezetű XML állományokat láthatunk:

<?xml version="1.0" encoding="utf-8"?>

<gyümölcsök xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns="http://www.somecompany.com/Fruits.xsd">

     <gyümölcs adat="valami">

          <fajta>körte</fajta>

          <szín>sárga</szín>

          <ár>210</ár>

     </gyümölcs>

     <gyümölcs>

          <fajta>alma</fajta>

          <szín>piros</szín>

          <ár>180</ár>

     </gyümölcs>

     <gyümölcs>

          <fajta>szőlő</fajta>

          <szín>kék</szín>

          <ár>600</ár>

     </gyümölcs>

     <gyümölcs>

          <fajta>barack</fajta>

          <szín>piros-sárga</szín>

          <ár>330</ár>

          <egyéb>magbaváló</egyéb>

     </gyümölcs>

</gyümölcsök>

A lényegi részt a 4. sorban kiemeltem. Itt van meghatározva, hogy milyen is az én ’gyümölcsök’ adattípusom. Ugyan ez itt most nem valóságos interneten közzétett definíció, de akár az is lehetne. Egy ilyen definícióban pontosan meg lehetne határozni, hogy milyen elemekből és attribútumokból kell állnia egy ilyen XML adatnak, hiszen láttuk eddig, hogy elég szabadon lehet bármilyen elemet és attribútumot az ilyen XML adatokhoz hozzáfűzni. Míg egy adatbázis esetében az adatbázis sémája, szerkezete határozza meg, hogy mit szabad tárolni és mit nem benne, addig az XML adatoknál ilyen névterekben lehetne ugyanezt meghatározni.

A mi szempontunkból most igazából a lekérdezésnél jelentkezik az XML névterek hatása. Ezt a módosított, névtér hivatkozással ellátott fájlt olvasom most be az $x változómba.

[22] PS C:\> $x = [xml](Get-Content C:\_munka\powershell\_Scripts\fruits.xml)

Ebben a hagyományos PowerShelles tulajdonság-jelöléssel ugyanúgy elérem a gyümölcsöket, mint korábban, azonban az XPath lekérdezésre már nem kapok semmit:

[23] 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

 

 

[24] PS C:\> $x | Select-Xml -XPath "//gyümölcs"

 

Ennek oka, hogy az XPath megköveteli, hogy az elemekre a névterükkel együtt hivatkozzunk, de ez sem annyira triviális, hogyan történik. Egy hashtábla formátumban elő kell állítani a névtér vagy névterek listáját a következő módon:

[25] PS C:\> $ns = @{

>>     MyNS = "http://www.somecompany.com/Fruits.xsd"

>> }

Ezután a kulcs címkéjével kell megjelölni az XML elemet és még egy –namespace paramétert is meg kell adni a Select-XML-nek:

[26] PS C:\> $x | Select-Xml -XPath "//MyNS:gyümölcs" -Namespace $ns | Select-O

bject -ExpandProperty node

 

adat                fajta               szín                ár

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

valami              körte               sárga               210

                    alma                piros               180

                    szőlő               kék                 600

                    barack              piros-sárga         330

Így már tökéletesen működik a keresés.



Word To HTML Converter