EB966950

Page 1


2.5XSLT–jazykbudoucnosti

2.6XMLReader–kdyžsezamotámedoSAX

2.8Závěr

3.1Znakovésady,kódováníaUnicode

3.1.1Znakovásada ..........................................................................67

3.1.2Kódování ...............................................................................68

3.1.3Unicode ................................................................................68

3.2PHPaprácesřetězci ..................................................................73

3.2.1Ručnípřekódování ......................................................................75

3.2.2Knihovnambstring

3.3Dalšíproblémy

3.3.1BOMaUTF-8

3.3.2PHPaUTF-16

3.3.3Unicodeaporovnávánířetězců ..........................................................84

4.SimpleXML...........................................................................87

4.1Načtenídokumentu

4.4Prácesejmennýmiprostory

5.1Události

5.1.1Začátekelementu

5.1.2Konecelementu .......................................................................106

5.1.3Znakovádata .........................................................................106

5.1.4Instrukceprozpracování ...............................................................107

5.1.5Začátekmapováníprefixujmennéhoprostoru

5.1.6Konecmapováníprefixujmennéhoprostoru

5.1.7Externíentita .........................................................................108

5.1.8Dalšíudálosti ..........................................................................108

5.2Vytvořeníparseru .....................................................................109

5.3Konfiguraceparseru

5.4Registraceobsluhyudálostí

5.5Čtenídat

5.6Obsluhachyb

5.7Zapouzdřeníobsluhyudálostídoobjektu

5.8Přepínáníobsluhyudálostí

6.1Objektováreprezentacedokumentu

6.2Načtenídokumentu

6.3Čtenídokumentu

6.3.1Informaceouzlu ......................................................................127

6.3.2Pohybpostromu

6.3.3Výběrelementůnazákladějména

6.3.4Průchodcelýmdokumentem

6.3.5VýběrelementunazákladěID

6.3.6Čteníatributů

6.4Modifikacedokumentu ...............................................................141

6.4.1Vytvářenínovýchuzlů

6.4.2Připojováníaodpojováníuzlů

6.4.3Kopírováníaklonováníuzlů

6.4.4Prácesatributy

6.4.5Manipulacestextovýmiuzly

6.4.6VytvořenínovéhoDOMstromu

6.4.7PrácesfragmentyXML

6.4.8Uloženídokumentu

6.5Konfiguraceparseru

6.6Obsluhachyb

6.6.1OšetřeníchybpřinačítáníXML

6.6.2OšetřenívýjimekpřiprácisDOMstromem

6.7ZpracováníHTML

6.8RozšiřováníobjektůDOM

7.3Čtenídat

7.3.1Čteníobsahuelementů

7.3.2Přeskočeníelementu

8.1Základnístrukturavýrazu

8.2Datovýmodel

8.3Testovánívýrazů

8.4Identifikátoryosy

8.5Testyuzlu

8.6Zkrácenýzápis

8.7Predikáty

8.10

8.9.1Matematickéoperátory

8.9.2Relačníoperátory

8.9.3Logickéspojky

8.9.4Sjednoceníseznamůuzlů

8.10.1

8.10.3 Logickéfunkce ........................................................................189

8.10.4

9.1.1Významschémat

9.1.2Historickývývojjazykůpropopisschématudokumentu .................................196

9.1.3Srovnánínejpoužívanějšíchjazykůpropopisschématudokumentu ......................198

9.2.1Deklaraceelementů ...................................................................203

9.2.2Deklaraceatributů ....................................................................205

9.2.3PřipojeníDTDkdokumentu ............................................................207

9.2.4ValidacedokumentůoprotiDTD ........................................................208

9.3XMLschémata .........................................................................209

9.3.1Datovétypy ...........................................................................210

9.3.2Jednoduchédatovétypy ...............................................................210

9.3.3Komplexnídatovétypy ................................................................217

9.3.4Jmennéprostory ......................................................................224

9.3.5Připojeníschématukdokumentuavalidace ............................................225

9.4RELAXNG

9.4.1Základnívzory ........................................................................228

9.4.2Pokročilévzory ........................................................................233

9.4.3Datovétypy ...........................................................................241

9.4.4Modularizaceschématu ................................................................248

9.4.5Jmennéprostory ......................................................................250

9.4.6ValidaceoprotiRELAXNGschématu

9.5Schematron

9.5.1ValidacepomocíXSLT ..................................................................253

9.5.2VloženíSchematronudoXMLSchema

9.5.3VloženíSchematronudoRELAXNG .....................................................255

9.5.4Pokročilávalidace .....................................................................256

9.6Best-practicespronávrhschémat

9.6.1Elementyneboatributy

9.6.2Jmennéprostory

9.6.3Názvyelementůaatributů

9.6.4Defaultníafixníhodnoty

9.6.5Verzováníschémat

9.6.6Rozšiřitelnostschémat

11.10.1 document()

11.10.2 key() .................................................................................311

11.10.3 format-number() ......................................................................311

11.10.4 current() ..............................................................................313

11.10.5 unparsed-entity-uri() ..................................................................313

11.10.6 generate-id() ..........................................................................314

11.10.7 system-property() .....................................................................317

11.10.8 element-available() ...................................................................318 11.10.9 function-available() ...................................................................318

Předmluva

Kdyžjsempředvíceneždesetiletypsalpředmluvukdnesjižlegendárníknize PHP–tvorbainteraktivníchinternetovýchaplikací [11],slíbiljsemvní,ženadoprovodnýweb knihyumístíminformaceoprácisformátemXML,kterésedoknihyjižnevešly.Zčasových důvodůknaplněnítohotoslibunikdynedošlo.Jakosatisfakciprotopřijmětetutoknihu. JejínáplníjepouzeXMLajehopoužitívPHP.

Desetletjedlouhádoba,alemyslím,žečekánísevyplatilo.PodporaXMLbylavPHPaž dojehoverze5.0poměrněpartyzánská.Ateprveodverze5.2lzePHPpovažovatzajazyk, vekterémsedásXMLrozumněpracovat.

OvýznamuXMLdnesjižnenípotřebanikohopřesvědčovat.Aťsenámtolíbínebone, XMLjezkrátkavšudeavewebovýchaplikacíchjepotřebastímtoformátempracovat.Ať užsejednáoimportyaexportydat,transformacidatproprezentačnívrstvunebobackend proAJAXovouaplikaci.Cílemtétoknihyjenaučitváspoužívatvšechnaexistujícírozhraní proprácistechnologiemiXML,kteráPHPnabízí.Popsánavysvětlenjevšakisamotný jazykXML,jehosyntaxeanavazujícítechnologiejakoXMLschémata,dotazovacíjazyk XPathatransformačníjazykXSLT.Propochopenívýkladutaknenínutnážádnávelká předchozízkušenostsXML–všepotřebnéjeprůběžněvysvětleno.

Vdnešnídobězačínajíbýtpapíraknihypovažoványzapříliškonzervativnímédium.Asi jsemstaromilecamámtištěnéknihyrád.Nicméněnaadrese http://www.kosek.cz/knihy/ phpxml/ najdetedalšíinformacesouvisejícísknihou–příkladykestažení,opravychyb apod.Máte-likeknizenějaképřipomínky,uvítámjenamojíemailovéadrese <jirka@kosek.cz>

Navznikuknihymázásluhumnoholidí.Nevyčerpatelnoutrpělivostprokázališéfredaktoři počítačovéredakceMiroslavLochmanaDanielVrba,kteřívydrželipětletčekatnadokončeníknihy.Pokudvknizenebudepřílišchyb,jetozásluhakorektorkyZuzanyVrbovéa redaktorkyEvySteinbachové.NejvětšídíkvšakpatříméženěLenceadětem,kteřítrpělivě snášelyméútěkykpočítačipřipsaníknihy.

Přejivámpříjemnéčteníknihy.

Liberec,10.dubna2009

JirkaKosek

Úvod

Vývojmoderníchwebovýchaplikacíkladenavývojářevysokénároky,jepotřebaznátširokéspektrumtechnologií.PočínajejazykyHTMLaCSSprodefinicisamotnéstránkyajejíhovzhledu,přesJavascriptprovytvářenívysoceinteraktivníchaplikací,ponějakýserverovýjazykjakojePHP.Každávětšíaplikacenavícpotřebujeněkamukládatdata,typicky dodatabáze.KtomujepotřebaznátprincipyprotokoluHTTPavědět,jakobcházetjeho limity.Aabytohonebylomálo,namnohamístechsevývojářwebovéaplikacesetká isformátemXML.

KdyžXMLvpolovině90.letminuléhostoletívznikalo,původnísměléplánybyly,žezcela nahradíjazykHTMLpřidoručováníobsahudoprohlížeče.Tatomyšlenkasevšakukázala jakopřílišrevolučníanavícproblémyspojenésjazykemXHTMLajehopodporouvprohlížečíchvočíchmnohawebovýchvývojářůnevrhlynaXMLpřílišrůžovésvětlo.Nicméně technologieXMLjsoudnespevnousoučástímnohawebovýchtechnologií,formátůaprotokolů,takžejepotřebaprácistímtoformátemovládat.

KdesenawebusXMLmůževývojářsetkat?SyntaxiXMLvyužívajímnohéprezentační formáty–počínajejazykemXHTML,přesstálepopulárnějšívektorovýgrafickýformátSVG, ažpojazykyprodefiniciuživatelskéhorozhranívmoderníchRIA(RichInternetApplication) prostředích,jakojeXAMLvSilverlightuaMXMLveFlashi.PokudtedyvašeskriptyvPHP vminulostigenerovalypřevážněHTMLkód,časembudoupřicházetpožadavkynadynamickoutvorbumodernějších,naXMLzaložených,formátů.

XMLdneszceladominujenapolipublikovánímetainformací.Jednásenapříkladoformáty propublikovánípřehledůnovýchčlánků,jakojsouRSSčiAtom.Protožezačleňovánísémantikyvestrojověčitelnépodoběpřímodowebovýchstránekjestálevplenkách,mnoho vyhledávačůnabízívlastníformáty,vekterýchjimmůžetepředávatinformacevylepšující vyhledávání–napříkladGoogleSitemapneboGoogleBase.

DalšívyužitíXMLjeprokomunikaciapředávánídat.XMLsevyužívájednakprovýměnu datmezibackendyjednotlivýchaplikacíadálepakvAJAXovýchaplikacíchprozasílání aktualizacídatdoprohlížeče.„Enterprise“aplikacepakprosamotnoukomunikacinevyužívajíprostéXML,alekomplexnějšímechanismuswebovýchslužeb.

Diverzitakoncovýchzařízenípoužívanýchpropřístupkwebusetakéstálezvyšuje. Webovéstránkyseužneprohlížejíjenzklasickéhopočítače,aleizchytrýchtelefonůnebo různýchPDA.Mnohéaplikacepotřebujíuspokojivěřešitmožnostkvalitníhotisku.Užnestačívytvořitaplikaci,kterávýstupygenerujejenjakoHTML.Projednotlivákoncovázařízeníjepotřebagenerovatodlišnéformátyvýstupuawebovouaplikacijepotřebaobohatit oflexibilníprezentačnívrstvu.ProvytvořenítakovévrstvylzevyužítijazykXMLastylové technologiejakoXSL.

Výšeuvedenývýčettoho,kdesenawebumůžemesetkatsXML,jistěneníúplný.Pouze potvrzujeto,žewebovývývojářsednesneobejdebezznalostitohotoformátuapráce sním.TatoknihavásnaučívšepotřebnéoformátuXMLanavazujícíchtechnologiícha otom,jaklzestímtoformátempracovatvPHP.

Prvníkapitolajeurčenázejménapročtenáře,kteříještěneznajíformátXML.Seznámíse zdesesyntaxíjazykaanaučísejikontrolovat.

Druhákapitolapakstručněshrnujeaukazuje,jakémožnostiproprácisXMLnabízíPHP. JetoideálnímístoproporovnáníjednotlivýchpřístupůproprácisXML.Nemusítetakčíst celouknihu,alevtétokapitolezjistíte,jakýzpůsobprácesXMLjeprovásnejvhodnějšía tensidálepodrobnějinastudujetevodpovídajícísamostatnékapitole.

TřetíkapitolapřímonesouvisísXML,aleukazuje,jaklzevPHPčástečněobejítchybějící podporuznakovésadyUnicode,kterouvyužíváijazykXML.

Následujíčtyřikapitoly,kterépodrobněpopisujíjednotlivározhraníproprácisXML–SimpleXML,SAX,DOMaXMLReader.Výběrvhodnéhorozhranízáležínapovazedat, kteráčtete,anatom,jakjepotřebujetezpracovat.

OsmákapitolaseznamujesdotazovacímjazykemXPath,kterýnabízíjednoduchouazároveň mocnoumetoduprovyhledáváníavýběrdatvdokumentechXML.Kroměsamotného dotazovacíhojazykajezdesamozřejměpopsáno,jakjejpoužívatvkombinacisrozhraními DOMaSimpleXML.

Dalšídvěkapitolysevěnujíkontrole(validaci)dokumentůXML.Zvláštěvotevřeném prostředíinternetujepotřebapočítatsnejhoršímavšechnyvstupydoaplikacepečlivě kontrolovat.ProdokumentyXMLtakovoukontrolunabízejíschémata,kterádokážípopsat povolenoustrukturuadatovétypydokumentXML.Devátákapitolatakpopisujenejpoužívanějšíschémovéjazykyavdesátékapitolejepakukázáno,jakpomocínichprakticky vPHPkontrolovatdatauloženávXML.

JedenáctákapitolavysvětlujezákladyjazykaXSLTajehopoužitívPHP.XSLTjenejvhodnějšíprostředekprotransformacedokumentůXMLdodalšíchformátů,včetněformátu HTML.Naleznetakuplatněnínapříkladvprezentačnívrstvěwebovéaplikace.

NásledujícídvanáctákapitolasepakvěnujekomunikacimeziaplikacemisvyužitímXML. Popsányjsoujakklasickéwebovéslužby,takjednoduššímechanismyjakoRESTaAJAX.

PoslednítřináctákapitolapakukazujemožnostiprogenerovánídokumentůXMLnavýstupu skriptu.

KnihajezaměřenazejménanavysvětleníprincipůanaukázkyvyužitíjednotlivýchtechnologiíaknihovenPHP.Vevětšiněpřípadůjsoupopsányvšechnymožnostijednotlivých knihovenPHP.Nicméněknihaprimárněnesloužíjakoreferenčnípříručka,protytoúčely jevhodnénahlížetidodokumentacePHPnaadrese http://docs.php.net/manual/en/

VšechnypříkladybylytestoványsPHPveverzi5.2avsoučasnédoběnicnenasvědčuje tomu,žebysevblízkédoběmělovjazycePHPměnitněco,cobyzpůsobilonefunkčnost skriptů.VětšinapoužitýchknihovenjestandardnísoučástíPHP.Chcete-lipoužívatXSLT, jepotřebadoPHPpřidatmodul php_xsl,prowebovéslužbyjezapotřebímodul php_soap akapitolaoUnicodevyužíváněkteréfunkcezmodulu php_mbstring

Dlouhé řádky ve výpisech, které musely být rozděleny, jsou označeny pomocí znaku ‚►‘.

1. SyntaxeXML

Chceme-lipracovatsdokumentyXML,musímesamozřejměvědět,jaktytodokumenty vypadají.VtétokapitoleseprotoseznámímesesyntaxíjazykaXMLadalšímijehorysy, kterébychomměliznát.Znáte-lijižXMLdobře,azajímávásjen,jaksesnímpracuje vPHP,můžetetutokapitolusmělepřeskočit.

1.1Elementyastrukturadokumentu

KaždýXMLdokumentseskládáz elementů.Elementysevtextuvyznačujípomocítzv. tagů. Většiněelementůodpovídajídvatagy–počátečníakoncový.

<para>Totojeobsahelementupara.</para>

Ukázkaobsahujejedenelement para.Jehoobsahjevyznačenpomocítagů <para> (počátečnítag)a </para> (ukončovacítag).Jennaokrajpoznamenejme,ževýšeuvedená ukázkajeasinejjednoduššímdokumentemXML,kterývůbecmůžemevytvořit.

Názvytagůsezapisujímeziznaky‚<‘a‚>‘.Ukončovacítagmápředsvýmnázvemještě znak‚/‘,abyseodlišilodpočátečního.

1.1Elementyastrukturadokumentu

Obrázek1.1:ZákladníčástidokumentuXML

Některéelementynemusejímítžádnýobsah.Můžemejesamozřejmězapisovattak,žeza počátečnímtagemuvedemehnedtenkoncový.

<para>Totojeobsahelementupara.<br></br>Atohletaké.</para>

Nenítovšakpřílišpohodlné,aprotomůžemevXMLpoužítještějednuvariantutagu, kteráříká,žeelementnemážádnýobsah.Počátečnítagukončímedvojicíznaků‚/>‘místo pouhého‚>‘akoncovýtagvynecháme.

<para>Totojeobsahelementupara.<br/>Atohletaké.</para>

KaždýdokumentXMLmusíobsahovatprovšechnypočátečnítagyodpovídajícíkoncový tag,nebomusíbýtpočátečnítagzapsánjakoelementsprázdnýmobsahem.Následující ukázkyjsouukázkamišpatnýchdokumentů,kterénevyhovujíspecifikaciXML.

<para>Totojeobsahelementupara.<br>Atohletaké.</para> Ukázkajechybná,neboťtag <br> neníukončen.

<para>Totojeobsahelementupara.<br/>Atohletaké.</oara>

Počátečnítag <para> neníukončenakukončovacímutagu </oara> vdokumentuneexistujeodpovídajícípočátečnítag.Chybourovněžje,kdyžseelementyvdokumentukříží.

<b>Ukázka<i>překřížení</b>elementů</i>

KaždýdokumentXMLmusíbýtcelýobsaženvjednomelementu.Následujícíukázkatedy nepředstavujesprávnýdokumentXML.

<nadpis>Pokusnýnadpis</nadpis> <odstavec>Prvníodstavec</odstavec> <odstavec>Druhýodstavec</odstavec> <odstavec>Třetíodstavec</odstavec>

Stačívšakpřidatjedenelement,kterývše„obalí“,avšejevpořádku.

<článek> <nadpis>Pokusnýnadpis</nadpis> <odstavec>Prvníodstavec</odstavec> <odstavec>Druhýodstavec</odstavec> <odstavec>Třetíodstavec</odstavec> </článek>

1.2Datovýmodeldokumentu

Vidělijsme,žeelementymůžemedosebezanořovat,takžeelementmůžeobsahovatdalší elementynebotext.Elementytakvytvářejíhierarchickoustromovoustrukturu.KaždýdokumentXMLsiprotomůžemepředstavitjakostrom,jehožjednotlivéuzlyodpovídajíjednotlivýmelementům(šedéuzlyvobrázku),případnětextuuvnitřelementů(bíléuzly vobrázku).

<osoba> <jméno>Jan</jméno> <příjmení>Novák</příjmení> <věk>42</věk> </osoba>

Uzlyodpovídajícítextovémuobsahuelementůjsouvestromuvždynanejnižšíúrovnilistů aužnaněnemohoubýtnavěšenyžádnédalšíuzly.Vpřípadě,žemáelementtzv. smíšený obsah,jsoujehodětmivestromovéreprezentacijaktextovéuzly,takuzlyodpovídající elementům.

1.2Datovýmodeldokumentu

<p>Kouření <b>škodí</b>zdraví.</p>

p

Kouření b zdraví. škodí

Prázdnéelementysevestromudokumentuobjevíjakouzly,kteréužtakénemajížádné děti.

<p>První řádka<br/> Druhá řádka</p>

První řádka br

Druhá řádka

VýšepopsanémustromovémumodeludokumentuXMLseříká infoset [7].Abstraktnídatový modelinfosetustručněřečenoříká,žedokumentXMLjestromovástrukturasložená zjednotlivýchuzlů.Uzlůjepřitomněkoliktypů(elementy,textovéuzly,atributy,komentáře,instrukceprozpracování,jmennéprostoryadalší).Ukaždéhouzlupakinfosetdefinujeněkolikjehovlastnostíjakojméno,rodiče,seznamdětíapod.Nainfosetujetakzaloženavětšinajazykůarozhraní,kteréjsouvystavenynadXML.Jetopochopitelné,protože připrácisdokumentemXMLnásvětšinouzajímájehostrukturaaobsahzachycenývelementech,ainfosetnabízíprávětentopohlednadokumentXML.Většinounástotižnezajímá pohlednadokumentXMLjakonatextovýsoubor,vekterémsevyskytujíspeciálníznačky oddělenépomocíznaků‚<‘a‚>‘odostatníhotextu,protožebychomsemuselisamistarat osyntaktickouanalýzutakovéhozdrojovéhotextu.

1.3Atributy

ElementyjsouzákladnímprostředkempročleněníinformacíuvnitřdokumentuXML.Kromě elementůlzeprozachyceníinformacívyužít atributy.Atributysevždyzapisujíkpočátečnímutaguelementu.

<odstaveczabezpečení="důvěrné">Nějakátajnáinformace.</odstavec> Vnašíukázcejsmeatributu zabezpečení přiřadilihodnotu důvěrné.Hodnotuatributu musímevždyuzavřítdouvozoveknebodoapostrofů.Ujednohotagulzepoužítvíceatributůnajednou,stačíjeoddělitmezerou.

<odstaveczabezpečení="důvěrné"autor='JanNovák'>Nějakátajnáinformace.</► odstavec>

1.SyntaxeXML

Ujednohoelementusepřitomnemohoupoužítdvaatributyseshodnýmnázvem. Vmnohapřípadechjejedno,zdanějakouinformaciuložímejakoelement,neboatribut. SrovnejtenapříkladnásledujícídvafragmentydokumentuXML:

<osobavěk="42"> <jméno>Pepa</jméno> </osoba>

<osoba> <jméno>Pepa</jméno> <věk>42</věk> </osoba>

Nicménězpraxepostupněvyplynuloněkolikpravidel,kterávámpomohouvybratsi,zda jevdanésituacilepšípoužítelementneboatribut.Spravidlyseseznámímevčásti9.6.1.

1.4Zápisvyhrazenýchznaků

Vzhledemktomu,žeseznak‚<‘používáprooddělenítagůodokolníhotextu,nenímožné jejzapsatdodokumentujentak.Musímehoopsatjakoznakovouentitu &lt;.

Vyřeštenerovnost3x&lt;5

Vidíme,žeodkaznaznakovouentituzačínáznakem‚&‘,protoitentoznakmusímedo dokumentuvkládatopisem &amp;

KřupavérohlíčkyvámdodápekařstvíŽemlička&amp;syn Pokudpotřebujemeuvnitřhodnotyatributupoužítzároveňuvozovkyiapostrofy,svýhodou využijemeodpovídajícíopisy &quot; a &apos;.XMLdefinujeještěpátouznakovouentitu &gt;,kterázastupujeznak‚>‘.Tentoznakvšakvevětšiněpřípadůmůžemezapisovatpřímo beznutnostiopisu.1

Tabulka1.1:PředdefinovanéznakovéentityXML

Znak Entita

< &lt; & &amp; > &gt; ' &apos; " &quot;

JazykXMLdefinujepouzetěchtopětentit.Dalšíznakovéentity,kteréznámezHTML,jako například &nbsp;, &copy; nebo &ndash;,vXMLkdispozicinejsou,nicméněsijemůžeme vpřípaděpotřebynadefinovatsami(viz1.13.1.1).

1 Opisjenutnýpouzevpřípadě,žebysevdokumentuvyskytovalasekvenceznaků‚]]>‘.Tasemusípřepsat jako ]]&gt;

1.5Názvyelementůaatributů

XMLje(narozdílnapříkladodHTML)citlivénavelikostpísmen.Počátečníakoncovýtag seprotomusíshodovativevelikostipísmen.Následujícíelementjechybný,protožesi neodpovídápočátečníakoncovýtag:

<NÁZEV>Tentoelementjezapsánšpatně.</název>

Samotnájménaelementůaatributůmohoupřitombýtvytvářenapoměrněvolně.První znakjménamusíbýtpísmenonebopodtržítko,dalšíznakymohounavícobsahovatičísla, tečkuapomlčku.Písmenapřitommohoubýtizjinénežanglickéabecedy.Jménaelementů aatributůtakmůžemepsátklidněčesky,nebotřebaruskyvazbuce:

<имя>Булгаков</имя>

1.6DeklaraceXML

KaždýdokumentXMLbymělzačínatdeklaracíXML,vekteréurčíme,jakouverziXML používámeavjakémkódováníjesouboruložen.

<?xmlversion="1.0"encoding="utf-8"?> <osoba>

<jméno>Jan</jméno>

<příjmení>Novák</příjmení> <věk>42</věk> </osoba>

Každáaplikace,kterápodporujeXML,musíumětzpracovatsouboruloženývkódování UTF-8neboUTF-16.ProtobychommělidokumentyXMLpřednostněukládataostatním posílatvjednomztěchtokódování.VpraxisepřitomčastějipoužíváUTF-8kvůlilepší kompatibilitěsestaršímiaplikacemi.Dokumentyjemožnéukládativjinýchkódováních, alepakmusímetotokódovánípovinněurčitvdeklaraciXMLanemámejistotu,žetento dokumentzvládnouzpracovatvšechnyaplikace.

Vpřípadě,žepotřebujemedodokumentuvložitnějakýznak,kterýbuďnenísnadnodostupnýnaklávesnicinebonejdereprezentovatvpoužitémkódování,můžemedodokumentuvložitodkaznačíselnýkódznakuvUnicode(podrobnějšívysvětleníproblematiky Unicodeakódovánínaleznetevkapitole3).PředchozídokumentXMLtakmůžemetaké zapsatjako:

<?xmlversion="1.0"encoding="us-ascii"?> <osoba>

<jméno>Jan</jméno> <příjmení>Nov&#xE1;k</příjmení> <věk>42</věk> </osoba>

Znak„á“bylnahrazensvýmčíselnýmkódem(U+00E1)zapsanýmvšestnáctkovésoustavě. Kódjemožnézapsativdesítkovésoustavě,včíselnémodkazunaznakpakchybí‚x‘.

<?xmlversion="1.0"encoding="us-ascii"?> <osoba>

<jméno>Jan</jméno>

<příjmení>Nov&#225;k</příjmení>

<věk>42</věk> </osoba>

1.7Komentáře

Pokudpotřebujemevdokumentuněcovysvětlitnebočásttextudočasněskrýt,svýhodou ktomupoužijemekomentář.Komentářjesoučástídokumentu,aleparseryjejignorují anenídálezpracováván.Komentářsezapisujemeziznaky <!-- a --> <!--Vysvětlujícítext-->

Komentářmůžeobsahovatcokoliv,kroměposloupnostiznaků .Ztohovyplývá,žekomentáředosebebohuželnemůžemezanořovat.Vkomentářidokoncemůžemepoužívat tagyatd.Jsouvšakzcelaignorovány.Tosehodíprodočasnévyřazeníčástidokumentu zezpracování.

<para>Prvníodstavec.</para> <!--<para>Šéfmilezekrkem.</para>--> <para>Třetíodstavec.</para>

1.8SekceCDATA

Pokudpotřebujemedodokumentuvložitvětšíkustextu,kdesehojněpoužívajíznakyse speciálnímvýznamemjako‚<‘,‚>‘a‚&‘,jenepohodlnéjezapisovatpomocíznakovýchentit. Vtakovýchpřípadechsepoužívátzv.sekceCDATA.Ocenímejizejménavpřípadech,kdy jesoučástíXMLdokumentukódnějakéhoprogramuneboHTMLčiXMLkód.Použitísekcí CDATAsiukážemenanásledujícímdokumentu.

<scripttype="text/javascript"><![CDATA[ for(i=0;i<10;i++) { document.writeln("<p>Ahoj</p>"); }]]>

</script>

BezpoužitísekceCDATAbybylzápispřecejenponěkudkrkolomný.

<scripttype="text/javascript"> for(i=0;i&lt;10;i++)

{ document.writeln("&lt;p&gt;Ahoj&lt;/p&gt;"); }

</script>

1.7Komentáře

ObecněsetedysekceCDATAzapisujíjako <![CDATA[«text»]]>.Textpřitommůžeobsahovatcokoliv,kroměsekvenceznaků ]]>.KonstrukceCDATAexistujevXMLpouzepro většípohodlíautorů,kteřízapisujíXMLkódručně.NepřidávádoXMLžádnounovousémantiku,jdejenoalternativnísyntaxi.

1.9Instrukceprozpracování

XMLdokumentymohoubýtzpracováványrůznýmiprogramy.Někdymůžebýtužitečné dodokumentuuložitřídícíinformace,kteréjsouurčenypouzeproněkterýprogram.Můžemetakdodokumentuzařaditodkaznastyldefinujícízobrazenívprohlížeči,formátovacímuprogramumůžemenaznačit,kdemázalomitstránku.Modernískriptovéjazykypro generovánídynamickýchwebovýchstráneksetakézapisujípřímodotěladokumentů.Pro všechnytytoúčelymáXMLkdispozicistandardnízpůsobprozařazenínestandardních informací.Nalibovolnémístodokumentu(kroměznačkovaní–podobnějakoukomentářů) můžemevložit instrukceprozpracování(processinginstructions).TytoinstrukceXML parserignoruje,předájenadřazenéaplikaci–záležínaní,zdajenějakvyužije.Syntaxe instrukcíjevelicejednoduchá.

<?«identifikátor»«data»?>

Pomocí «identifikátoru» můžemerozlišovatjednotlivédruhyinstrukcí–dojednohodokumentumůžemeumístitinstrukceproněkolikrůznýchprogramů.Samotná «data» instrukce mohoumítlibovolnýtvar,alenesmějíobsahovatsekvenciznaků ?>

Pomocíinstrukcíprozpracovánílzedodokumentůzařaditnapříkladpříkazyskriptovacího jazykaPHP.

<dokument> <datum>Dnešnídatumje<?phpechoDate("d.m.Y")?></datum> <para>Nějakédůležitéinformace.</para> </dokument>

PomocíinstrukcíprozpracovánísekXMLdokumentupřipojujíistylydefinujícízobrazení vprohlížeči.

<?xmlversion="1.0"encoding="utf-8"?> <?xml-stylesheethref="styl.css"type="text/css"?> <clanek>

<zahlavi> <rubrika>Tématýdne</rubrika> <nazev>XMLastylovéjazyky</nazev> <autor>JiříKosek</autor> </zahlavi> ... </clanek>

1.10Automatickákontrolasyntaxe

Splňuje-lidokumentvšechnavýšeuvedenápravidla,jesyntaktickyvpořádkuaříkáme oněm,žeje správněstrukturovaný(well-formed).

Správnousyntaxisimůžemenechatzkontrolovatpomocítzv. parseru.Jednoduchýparser XMLjednesobsaženvkaždémwebovémprohlížeči,stačívněmotevřítdokumentXML avpřípaděchybydostanemechybovéhlášení.Můžemesitovyzkoušetnanásledujícím dokumentu,kterýobsahujedvěchyby–překlepvnázvukoncovéhotagu jméno aneukončenýelement věk.

<?xmlversion="1.0"encoding="utf-8"?>

<osoba>

<jméno>Jan</jémno>

<příjmení>Novák</příjmení>

<věk>42

</osoba>

Prohlížečesevětšinouzastavínaprvníchybě,kterounaleznou(vizobrázek1.2).Mnoho parserůjedostupnýchivpodobějednoduchéhoprogramu,kterýmůžemespouštětzpříkazovéřádky.Velicerychlýanafunkcebohatýjeparser xmllint2,kterýproprácisXML používástejnouknihovnulibxml2jakoPHP.Následujícíukázkazobrazujevýstupprogramu xmllint přizpracovánídokumentuzpředešléhopříkladu.

$ xmllint--nooutdokument-s-chybou.xml dokument-s-chybou.xml:3:parsererror:Openingandendingtagmismatch:jméno ► line3andjémno <jméno>Jan</jémno> ^

dokument-s-chybou.xml:6:parsererror:Openingandendingtagmismatch:věk ► line5andosoba </osoba>

^ dokument-s-chybou.xml:6:parsererror:Prematureendofdataintagosobaline2 </osoba>

1.11Jmennéprostory

JednímzezákladníchcílůjazykaXMLjeposkytnoutaplikacímformát,vekterémpůjde vyměnovatinformacepocelémsvětě.Prodosaženítohotoúkolujevšakpotřebazajistit, abybylyelementypoužívanévdokumentechjednoznačněidentifikovanéanavzájem rozlišitelné.Jinaknebudemenapříkladschopnirozlišit,zdaelement název popisujenázev knihyvkataloguknihkupectví,neboobchodnínázevfirmyvevýpisuzobchodního rejstříku,neboještěněcoúplnějiného.Nutnostjednoznačnéhorozlišeníelementůjedůležitávtěchpřípadech,kdypřesněnevíme,jakéinformacezpracovávanýdokumentobsahuje, nebozpracovávámekomponovanýdokument,kterýobsahujeelementyzněkolikarůzných oblastí.

2 http://xmlsoft.org/

Obrázek1.2:ZobrazeníchybyvdokumentuXML

ProblémjednoznačnéidentifikaceelementůvdokumentechXMLřeší jmennéprostory Používáme-livdokumentuXMLjmennéprostory,neníuželementjednoznačněidentifikován jensvýmjménem,alekombinacíjménaajmennéhoprostoru.Jmennýprostormápřitom podobuadresyURI,kterázajišťujemožnostcelosvětověvytvářetnováURIapřitomzachovat jejichunikátnost.Důležitéjeuvědomitsi,žeURIadresavtomtopřípaděsloužíjenjako identifikátor,aplikacepracujícísXMLsenikdynesnažíztétoadresyzískatnějakýdokument.

Prorozlišenídvoudřívezmíněnýchvýznamůelementu název takmůžemepoužítdva různéjmennéprostory.VnásledujícífiktivnísyntaxidoplnímepřednázvyelementůURI jmennéhoprostoru.

<{http://knihkupectvi.cz/katalog}název>ČukaGek</{http://knihkupectvi.cz/► katalog}název>

<{http://justice.cz/ns/or}název>Grada</{http://justice.cz/ns/or}název>

Vidíme,žekombinaceURIjmennéhoprostoruanázevelementujeteďužjednoznačnáa jemožnéodlišit,kdyseojakýnázevjedná.Zároveňvšakvidíme,ževýšeuvedenýzápis bybylvelminepohodlnýazdlouhavý.Veskutečnostiseaninejednáosyntaxi,kteráby fungovala,šlomijenonaznačeníprincipu.Vdokumentechseprousnadněnízápisupříslušnostielementudonějakéhojmennéhoprostorupoužívájednaznásledujícíchdvou syntaxí.

Prvnímožnostíjepoužití implicitního(výchozího)jmennéhoprostoru.Chceme-li,abynějakýelementavšichnijehopotomci(tj.elementyvněmobsažené)patřilydonějakého jmennéhoprostoru,stačíkdyžutohotoelementunadeklarujemepožadovanýjmenný prostorjakoimplicitnípomocíatributu xmlns.Následujícíukázkajedokumentvjazyce

XHTML,kdevšechnyelementypatřídojmennéhoprostoru http://www.w3.org/1999/ xhtml

<?xmlversion="1.0"encoding="UTF-8"?> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <title>UkázkaXHTMLstránky</title> </head> <body> <h1>UkázkaXHTMLstránky</h1> <p>Všechnyelementyvtomtodokumentupatří dojmennéhoprostoruXHTML.</p> </body> </html>

Druhávariantaspočívávdeklaraciprefixu,kterýzastupujezvolenýjmennýprostor.Tento prefixsepakzapisujepředjménavšechelementůpatřícíchdojmennéhoprostoru.Deklaraceprefixujmennéhoprostoruseprovádípomocíatributuvespeciálnímtvaru:

xmlns:«prefix»="«URI»"

NášukázkovýXHTMLdokumentprotomůžemezapsattakénásledujícímzpůsobem:

<?xmlversion="1.0"encoding="UTF-8"?> <html:htmlxmlns:html="http://www.w3.org/1999/xhtml"> <html:head> <html:title>UkázkaXHTMLstránky</html:title> </html:head> <html:body> <html:h1>UkázkaXHTMLstránky</html:h1> <html:p>Všechnyelementyvtomtodokumentupatří dojmennéhoprostoruXHTML.</html:p> </html:body> </html:html>

Zápisujménaelementuvetvaru html:title seříká kvalifikovanéjménoelementu(QName). Toseskládázprefixu(html)azlokálníhojména(title).Kombinacelokálníhojménaa jmennéhoprostoru,prokterýjeprefixdeklarován,společnějednoznačněidentifikujeelement.Prefixovšemmůžebýtlibovolný,sloužíjenjakopomůckaprozkrácenízápisu.Vždy jevšakdůležité,jakýjmennýprostorzastupuje.

Jmennéprostorynacházejíuplatněnízejménavdokumentech,kteréseskládajízrůzných sadznaček.Vpraxijetakovýchpřípadůhodně.MůžememítnapříkladXHTMLdokument, kterýobsahujevloženéobrázkyveformátuSVGamatematickévzorcevMathML.Elementy těchtotříznačkovacíchjazykůjsoupřitomvezvláštníchjmennýchprostorech,abychomje dokázalirozlišit.StylyzapsanévjazyceXSLTzasepoužívajíjmennéprostorykodlišení výkonnýchinstrukcíXSLTodelementů,kterésejenkopírujínavýstuptransformace.

NásledujícíukázkazachycujedokumentvXHTML,kterýobsahujevloženýfragmentkódu sobrázkemvSVG.

<?xmlversion="1.0"encoding="UTF-8"?> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">

<head> <title>UkázkaXHTMLstránkyseSVGobrázkem</title> </head> <body>

<h1>UkázkaXHTMLstránkyseSVGobrázkem</h1> <svg:svgwidth="4in"height="3in"viewBox="00400400"> <svg:title>Žlutýkruhs červenýmnápisem</svg:title> <svg:g>

<svg:circlestyle="fill:yellow;stroke:blue" cx="200"cy="200"r="150"/> <svg:textx="80"y="200" style="font-size:36px;font-family:Verdana; color:red;fill:red">Dobrouchuť</svg:text> </svg:g> </svg:svg> </body> </html>

Deklaraceprefixujmennéhoprostoruneboimplicitníhojmennéhoprostoruplatíproelement,vekterémjeuvedena,aprovšechnyjehopodelementy.Pokudvšaknaněkterém zpodelementůprefixneboimplicitníjmennýprostorpředefinujeme,platínovádefinice. Předchozídokumenttakmůžemezapsatinásledujícímzpůsobem:

<?xmlversion="1.0"encoding="UTF-8"?>

<htmlxmlns="http://www.w3.org/1999/xhtml">

<head>

<title>UkázkaXHTMLstránkyseSVGobrázkem</title> </head> <body>

<h1>UkázkaXHTMLstránkyseSVGobrázkem</h1> <svgxmlns="http://www.w3.org/2000/svg"

width="4in"height="3in"viewBox="00400400"> <title>Žlutýkruhs červenýmnápisem</title> <g>

<circlestyle="fill:yellow;stroke:blue"cx="200"cy="200"r="150"/> <textx="80"y="200"

style="font-size:36px;font-family:Verdana; color:red;fill:red">Dobrouchuť</text> </g> </svg> </body> </html>

Vtaktosloženýchdokumentechpřitomjmennéprostorynesloužíjenkodlišeníjednotlivých elementů,alepředevšímkjejichjednoznačnéidentifikaci.Ví-liprohlížeč,ženějakéelementy patřídojmennéhoprostoruXHTML,ajinézasedojmennéhoprostoruSVG,můžejepodle tohointerpretovat.Ukazujetoobrázek1.3,kdejepřímovestráncevloženýSVGobrázek vykreslen.

Obrázek1.3:ZobrazeníXHTMLstránkysvloženýmobrázkemSVG

Obrázek1.4zachycujepřípad,kdyjsmeelementySVGneumístilidojmennéhoprostoru, prohlížečjetedynerozpoznalanezpracovaljakoSVGobrázek.

Obrázek1.4:ZobrazeníXHTMLstránkysešpatněvloženýmSVG

Atributysevběžnýchpřípadechdojmennéhoprostoruneumisťují,aprotosenaněani nevztahujeimplicitníjmennýprostor.Chápesetotak,žeatributpatřívždykelementu, ukteréhojeuveden,atentoelementuždonějakéhojmennéhoprostorupatří.

Nicméněiatributypatřícídonějakéhojmennéhoprostorumajísvéuplatnění.Říkásejim globálníatributyajednáseoobecnéatributy,kterélzepoužítujakýchkolivelementůa přidávajíjimspeciálnísémantiku.Např.vjmennémprostoru http://www.w3.org/2001/ XMLSchema-instance jsoukdispoziciatributyurčujícíumístěníschématuneboneurčenou hodnotu.

<osobaxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="osoba.xsd"> <jméno>Jenda</jméno> <narozenxsi:nil="true"></narozen> </osoba>

Atributy noNamespaceSchemaLocation a nil jdepoužítulibovolnéhoelementuaprávě proto,abynemohlodojítkekolizisjinýmiatributy,jsouumístěnyvespeciálnímjmenném prostoru.

PodobněfungujíatributystandarduXLink,kteréumožňujízlibovolnéhoelementuudělat odkaz.Například:

<paraxmlns:xlink="http://www.w3.org/1999/xlink">Prozjištění délky řetězcemůžemepoužítfunkci <functionxlink:href="http://php.net/strlen">strlen</function>. </para>

1.12Prácesbílýmiznaky

VdokumentuXMLseobvyklevyskytujevelkémnožstvíbílýchznaků(mezer,koncůřádek, tabulátorů),kterésloužíprozpřehledněnízápisu–obvyklesekaždýelementuvádína novémřádkuavelikostjehoodsazeníodpovídáhloubcejehozanořenídoostatníchelementů.Tytobíléznakyvšakobecněnejdepokládatzazbytečné,aprotojsouvždyparserem předányaplikacikdalšímuzpracování.Bíléznakypoužitéprozpřehledněnízápisuse vdatovémmodeludokumentuXMLvětšinouprojevíjakotextovéuzly,kteréseskládají pouzeztěchtobílýchznaků.

Popsanéchovánídemonstrujeinásledujícíukázka.StromdokumentuXMLobsahujemezi všemielementytextovéuzlysbílýmiznaky.Jedůležitésiuvědomit,žetytouzlyjsou součástídokumentuapřizpracovánísnimipočítat.

<osoba>

<jméno>Jan</jméno>

<příjmení>Novák</příjmení>

<věk>42</věk> </osoba>

Vnašempříkladějeevidentní,žetextovéuzlysbílýmiznakyjsouskutečněproobsah dokumentuzcelazbytečnéabylobymožnéjeignorovat.Knihovnalibxml2dokonce umožňujetytouzlyautomatickyodstranit.Jakbydokumentdopadlpoodstraněníuzlů sbílýmiznaky,můžemezkontrolovatipomocířádkovéutility xmllint

$ xmllint--noblanksosoba.xml

<?xmlversion="1.0"encoding="utf-8"?> <osoba><jméno>Jan</jméno><příjmení>Novák</příjmení><věk>42</věk></osoba>

Vpraxisevšaksetkámeispřípady,kdyjeodstraněnítextovýchuzlůsbílýmiznakynežádoucí.Jednáseotzv. smíšenýobsah.Elementysesmíšenýmobsahemjsoutakovéelementy, kterémohouobsahovatjakpřímotext,takdalšípodelementy.Typickýmpříklademsmíšenéhoobsahujsouodstavce–tyobsahujítext,alevněmsemohouvyskytovatdalšíelementy napříkladprozvýrazněnítextuneboprovytvářeníodkazů.Textovéuzlysbílýmiznaky vesmíšenémobsahučastonesoudůležitouinformaci,jakomezerymezislovy.Všeukazuje následujícídokument.

<?xmlversion="1.0"encoding="utf-8"?> <dokument> <p>Prvníodstavecobsahujenaprvnípohledsmíšenýobsah. Tadysenám<em>Jan</em><i>Novák</i>neslijedohromady.</p> <p><em>Jan</em><i>Novák</i></p> </dokument>

Kdybychomteďnechaliparserodstraňovatuzlysbílýmiznaky,chybněvdruhémodstavci odstranímezerumezislovyJanaNovák,adostanemetaknesmyslnýtext.

$ xmllint--noblanksodstavec.xml

<?xmlversion="1.0"encoding="utf-8"?> <dokument><p>Prvníodstavecobsahujenaprvnípohledsmíšenýobsah. Tadysenám<em>Jan</em><i>Novák</i>neslijedohromady.</p><p><em>Jan</► em><i>Novák</i></p></dokument>

Pročsetakstalo?Důvodjejednoduchý,parsersebeznějakýchpřídavnýchznalostínemůže správněrozhodnout,kdysejednáosmíšenýobsahakdyne.Uprvníhoodstavcešlojednoznačněosmíšenýobsah,protožesenastejnéúrovnivyskytovaltextielementy.Vdruhém odstavcisevšakuvnitřelementu p objevilyjenbíléznakyadalšíelementy.Nešlojejtedy rozlišitodsituace,kdyjsouuzlysbílýmiznakyvdokumentučistěprookrasu.

Vidímetedy,žeříkatparseruoodstraněníbílýchznakůjebezpečnépouzevpřípadě,kdy jsmesijistí,ževdokumentunepoužívámesmíšenýobsah.Pokudtoneuděláme,hrozí,že přizpracovánídokumentupřijdemeoněkterépodstatnéinformace.

Abymohlparsersprávněpoznat,kteréelementyobsahujísmíšenýobsahakteréne,muselo bykněmubýtpřipojenéschémadokumentu.Znějlzepoznat,kteréelementyobsahují jendalšípodelementyakterémajísmíšenýobsah.KdybychomkdokumentudoplnilinapříkladDTD(vícesionichpovímevčásti9.2),odstraněníbílýchznakůproběhnebezpečně. <?xmlversion="1.0"encoding="utf-8"?> <!DOCTYPEdokument[ <!ELEMENTdokument(p+)> <!ELEMENTp(#PCDATA|em|i)*> <!ELEMENTem(#PCDATA)> <!ELEMENTi(#PCDATA)>

]> <dokument>

<p>Prvníodstavecobsahujenaprvnípohledsmíšenýobsah. Tadysenám<em>Jan</em><i>Novák</i>neslijedohromady.</p> <p><em>Jan</em><i>Novák</i></p> </dokument>

$ xmllint--noblanksodstavec-dtd.xml <?xmlversion="1.0"encoding="utf-8"?> <!DOCTYPEdokument[ <!ELEMENTdokument(p)+> <!ELEMENTp(#PCDATA|em|i)*> <!ELEMENTem(#PCDATA)> <!ELEMENTi(#PCDATA)> ]>

<dokument><p>Prvníodstavecobsahujenaprvnípohledsmíšenýobsah. Tadysenám<em>Jan</em><i>Novák</i>neslijedohromady.</p><p><em>Jan</► em><i>Novák</i></p></dokument>

Vidíme,žeuzlysbílýmiznakyseodstranilyjenmezielementy dokument a p tak,jakto určujeDTD.Element p jedefinovánjakosmíšenýobsah,aprotosevněmbíléznakyneodstraňují.

Bílýmznakůmjsmesevěnovaliponěkudvíce,protožejetotéma,vekterémmámnoho lidípoměrnědostnejasností.Jetoumocněnoitím,ževýchozíkonfiguraceparseruMSXML odMicrosoftusechovánestandardněavšechnyuzlysbílýmiznakyvypouští.

Každýparsernavícprovádíurčitéúpravybílýchznaků,abyusnadnilpráciaplikaci,která dokumentyXMLzpracovává(vnašempřípadětedyPHPskriptu).Prvníúpravaspočívá vnormalizaciznakůprokonecřádku.Různépočítačovéplatformypoužívajírůznéznaky prokonecřádku–veWindowsjetosekvenceznakůCRLF,naunixechznakLFana MacoviCR.ParserXMLprotovšechnytytokombinacevždypřevedenaznakLF(kódtohoto znakuje10).

Oněcokomplexnějšíjenormalizacehodnotatributů.Nejprvejsouvhodnotěatributu znormalizoványznakykonceřádkunaLFapotésevšechnybíléznaky(tedyLF,mezery atabulátory)převedounamezery.3

1.13Skládánídokumentů

Jsousituace,kdysekousektextuneboznačkovánívdokumentuopakujenaněkolika místechamyhonechcemeopisovatpořáddokola.Jindyzasechcemeurčitoučástkódu XMLpoužívatvevícerůznýchdokumentechXMLnajednou.ProobatytoúkolynabízíXML nástroje–jednakstaršízaloženénaentitáchanovějšízaloženénastandarduXInclude.

3 Je-linavícatributdeklarovánvDTDamájinýtypnežCDATA,jenormalizaceještěsložitější.Vpřípaděpotřeby senajejípopismůžetepodívatdospecifikaceXML http://www.w3.org/TR/REC-xml/#AVNormalize

1.SyntaxeXML

1.13.1Entity

KaždýdokumentXMLsemůžeskládatzněkolikaentit.Všechnydokumenty,kteréjsme zatímviděli,seskládalypouzezjednéentity,kterátvořilacelýdokument.Nazačátkudokumentuv deklaracitypudokumentu můžemedefinovatjednunebovíceentit,nakteré sepakmůžemedálevtěledokumentuodkazovat.KaždýodkaznaentitusenahradífragmentemkóduXML,kterýzastupuje.

Deklaraceentitsenejčastějiuvádějívtzv. internípodmnožině:

<?xmlversion="1.0"encoding="utf-8"?>

<!DOCTYPE «kořenovýelement» [ «deklaraceentit» ]>

Entityjemožnédefinovativ externípodmnožině,kteráobvykleobsahujeschémadokumentuvpodoběDTDapoužívásevevícedokumentech.Podrobnějšívýkladtohoto způsobunajdetev9.2.

Deklaraceentitymápřitomtvar:

<!ENTITY «názeventity» …>

Taktodeklarovanouentitupakmůžemepoužítvdokumentupomocí odkazunaentitu, kterýmátvar:

&«názeventity»;

1.13.1.1Internítextovéentity

Internítextovéentityumožňujídeklarovatentitu,kterázastupuječastopoužívanýtext,kus XMLkódunebotřebajenznaktěžkodostupnýnaklávesnici.Odkaznatutoentitupak můžemepodlelibostipoužívatdálevdokumentuvobsahuelementůneboatributů.

Příklad1.1: Ukázkainterníchtextovýchentit– syntaxe/interni-entity.xml <?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmanuál[

<!ENTITYprogram"Headache2.7"> <!ENTITYnbsp"&#160;"> ]> <manuál> <název>&program;-Uživatelskápříručka</název> <odstavec>Program&program;můžetespustitvýběrempříkazuv&nbsp;menu.</► odstavec> <odstavec>Odinstalováníaplikace&program;nenímožné.</odstavec> </manuál>

Přizpracovánídokumentuseodkazynaentityautomatickynahradítextem,kterýentita zastupuje.Ověřitsitomůžemezasepomocíprogramu xmllint ajehovolby --noent $ xmllint--noentinterni-entity.xml

<?xmlversion="1.0"encoding="UTF-8"?> 1.13.1Entity

<!DOCTYPEmanuál[ <!ENTITYprogram"Headache2.7"> <!ENTITYnbsp"&#160;"> ]>

<manuál>

<název>Headache2.7-Uživatelskápříručka</název> <odstavec>ProgramHeadache2.7můžetespustitvýběrempříkazuvmenu.</► odstavec>

<odstavec>OdinstalováníaplikaceHeadache2.7nenímožné.</odstavec> </manuál>

1.13.1.2Externítextovéentity

Externítextovéentityumožňujídokumentsložitdohromadyzněkolikasamostatných souborů.Jetoužitečnézejménatehdy,kdypotřebujemeručnězpracovávatdlouhýdokument.Rozdělenímdokumentudoněkolikasouborůzískámekratšídokumenty,kterése snadnějieditují.Problémexterníchentitjevtom,žesamostatnéentitynemohouobsahovat vlastnídeklaracitypudokumentu,atudížmohoupoužívatpouzeentitydefinované v„hlavním“dokumentuanelzejezpracovatsamostatně(používají-lientity).

Příklad1.2: Externíentita– syntaxe/kapitola.xml

<?xmlversion="1.0"encoding="UTF-8"?> <kapitola> <název>Úvod</název> <odstavec>Taktohlejetextsamostatnékapitoly.</odstavec> <odstavec>Troškutentextještě prodloužíme.</odstavec> </kapitola>

Příklad1.3: Soubornačítajícíexterníentitu– syntaxe/externi-entity.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmanuál[ <!ENTITYuvodSYSTEM"kapitola.xml"> ]>

<manuál>

<název>Uživatelskápříručka</název> &uvod; </manuál>

Vmístěodkazunaentitu &uvod; sedodokumentuvložícelýobsahexterníhosouboru kapitola.xml.Můžemeseotompřesvědčit.

$ xmllint--noentexterni-entity.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmanuál[ <!ENTITYuvodSYSTEM"kapitola.xml"> ]>

<manuál> <název>Uživatelskápříručka</název>

<kapitola> <název>Úvod</název> <odstavec>Taktohlejetextsamostatnékapitoly.</odstavec>

<odstavec>Troškutentextještě prodloužíme.</odstavec> </kapitola> </manuál>

Vdeklaracientityzaklíčovýmslovem SYSTEM můžemepoužítjakoukolivadresuURI,nejčastějiseprotopoužíváadresaURL,aťužrelativníneboabsolutní.

1.13.2XInclude

Skládánídokumentůpomocíexterníchentitmáněkterénevýhody–externíentitynemohou mítvlastnídeklaracitypudokumentuanavícjemechanismusentitnepřímý–nejdříve entitudeklarujemeateprvepotéjipoužíváme.Navícsyntaxeprodeklaracientitponěkud vybočujezesyntaxeprozápiselementůaatributů,protožebyladoXMLpřevzatazjeho historickéhopředchůdcejazykaSGML.

VšechnatatoomezenířešístandardXInclude.Tendefinujeelement include vejmenném prostoru http://www.w3.org/2001/XInclude.Sémantikatohotoelementujetaková,že elementsenahradísouborem,nakterýukazujejehoatribut href

Příklad1.4: SloženídokumentupomocíXInclude– syntaxe/xinclude.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<manuál>

<název>Uživatelskápříručka</název> <xi:includexmlns:xi="http://www.w3.org/2001/XInclude" href="kapitola.xml"/> </manuál>

Prootestovánískládáníentitmůžemeopětvyužít xmllint,tentokrátmuvšakpomocíparametru --xinclude řekneme,abyvyhodnotilelementyXInclude,nakterévdokumentu narazí.

$ xmllint--xincludexinclude.xml

<?xmlversion="1.0"encoding="UTF-8"?> <manuál>

<název>Uživatelskápříručka</název> <kapitola> <název>Úvod</název> <odstavec>Taktohlejetextsamostatnékapitoly.</odstavec> <odstavec>Troškutentextještě prodloužíme.</odstavec> </kapitola> </manuál>

XIncludeumožňujenahraditiinterníentity,byťužnetolikelegantnímzpůsobem.Definice všechtextů,kterésemajíopakovaněpoužívat,můžemeumístitdosamostatnéhosouboru akaždémuelementupřiřaditunikátníidentifikátor,jakukazujenásledujícípříklad.

Příklad1.5: Definicesdílenýchelementů– syntaxe/definice.xml <?xmlversion="1.0"encoding="UTF-8"?> <definice> <textxml:id="program">Headache2.7</text> </definice>

VadreseelementuXIncludemůžemezaznakem‚#‘uvéstidentifikátorelementunebo isložitějšíXPointervýraz,kteréurčí,jakáčástzceléhoodkazovanéhoelementusemádo dokumentuvložit.

Příklad1.6: NahrazeníinterníchentitpomocíXInclude– syntaxe/xinclude-fragmenty. xml

<?xmlversion="1.0"encoding="UTF-8"?>

<dokumentxmlns:xi="http://www.w3.org/2001/XInclude"> <název>Uživatelskápříručka</název> <!--načteníceléhoelementuurčenéhopomocíID--> <xi:includehref="definice.xml#program"/> <!--načtenítextuelementu--> <xi:includehref="definice.xml#xpointer(id('program')/text())"/> </dokument>

Posloženípakbudedokumentvypadatnásledovně:

$ xmllint--xincludexinclude-fragmenty.xml

<?xmlversion="1.0"encoding="UTF-8"?> <dokumentxmlns:xi="http://www.w3.org/2001/XInclude"> <název>Uživatelskápříručka</název> <!--načteníceléhoelementuurčenéhopomocíID--> <textxml:id="program">Headache2.7</text> <!--načtenítextuelementu--> Headache2.7 </dokument>

XIncludemůžemepoužítiprovloženítextovéhosouboru,kterýsenemáchápatjakodokumentXMLobsahujícíznačkování.Pomocípřídavnýchatributůurčíme,žesejedná otextovýsouboravjakémjeuloženkódování.

Příklad1.7: VloženítextovéhosouborupomocíXInclude <?xmlversion="1.0"encoding="UTF-8"?> <dokumentxmlns:xi="http://www.w3.org/2001/XInclude"> <název>VýpisPHPskriptu</název> <xi:includehref="demo.php"parse="text"encoding="iso-8859-2"/> </dokument>

$ xmllint--xincludexinclude-text.xml <?xmlversion="1.0"encoding="UTF-8"?> <dokumentxmlns:xi="http://www.w3.org/2001/XInclude"> <název>VýpisPHPskriptu</název> &lt;?php //ukázkovýskriptvPHP echo"Ahoj"; phpinfo(); ?&gt; </dokument>

1.14Katalogovésoubory

MnohodokumentůXMLnejdezpracovatsamostatně,aleprojejichkorektnízpracováníje potřebanačístidalšísouboryspřídavnýmiinformacemi.Vezměmesijakopříkladstránku vjazyceXHTML.Začátektakovéstránkyvypadánásledovně:

<?xmlversion="1.0"encoding="utf-8"?>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <htmllang="cs"xml:lang="cs"xmlns="http://www.w3.org/1999/xhtml">

Vidíme,žedruhářádkaobsahujedeklaracitypudokumentu,kteráukazujenaDTDdefinujícíelementyaatributypřípustnéuvnitřdokumentůXHTML.DTDjepřitomumístěnona webovémserveru,takženapříkladpřipokusuovalidacidokumentusemusíceléDTD nejprvestáhnoutateprvepotéseprovedesamotnávalidace.

$ xmllint--noout--validstranka.xhtml

Isrychlýmpřipojenímkinternetubudevalidacetrvatpársekund,kdyčekáme,nežse stáhneDTD.Cosestane,kdyžnebudemepřipojeniksíti?ParserusenepodařízískatDTD apokusonačtenídokumentuselže.

$ xmllint--noout--validstranka.xhtml

stranka.xhtml:3:warning:failedtoloadexternalentity"http://www.w3.org/TR/► xhtml1/DTD/xhtml1-strict.dtd" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ^

stranka.xhtml:4:validityerror:Validationfailed:noDTDfound! <htmllang="cs"xml:lang="cs"xmlns="http://www.w3.org/1999/xhtml"> ^

stranka.xhtml:6:parsererror:Entity'ndash'notdefined <title>Slohovápráce&ndash;JanNovák</title> ^

stranka.xhtml:12:parsererror:Entity'nbsp'notdefined <p>Loremipsumdolorsitamet,consectetueradipiscingelit.

Vidíme,žesnahaovalidacidokumentu,kterýDTDnačítázesítě,nemusíbýtvždyúspěšná, aikdyžjeúspěšná,takjepoměrněpomalá.Jaktentostavvylepšit?Můžemesisamozřejmě říci,žepřecenepotřebujemevalidaciprovádětanemusímetedynačítatDTD.Tobohužel nenípravda,protožeDTDkromědeklaracíelementůaatributůobsahujeideklaraceentit, kterévdokumentuběžněpoužíváme(např.vXHTMLjsoutoentityjako &nbsp;, &copy; a &ndash;).Takžeikdyžvalidacioželíme,nepůjdedokumentbezDTDkorektnězpracovat, protožeparsernebudevědět,jakýmtextemmánahraditodkazynaentity.

ŘešenímtohotoproblémujeumístitsikopiiDTDnasvémlokálnímpočítačiapřinutit parser,abytutolokálníkopiipoužívalmístoDTDumístěnéhoněkdenainternetu.Většina parserůjeschopnáříditsepřizpracovánídokumentů katalogovýmsouborem,kterýslouží kmapováníodkazůnaexterníentity(včetněDTD)najejichlokálníkopie.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.