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 <.
Vyřeštenerovnost3x<5
Vidíme,žeodkaznaznakovouentituzačínáznakem‚&‘,protoitentoznakmusímedo dokumentuvkládatopisem &
KřupavérohlíčkyvámdodápekařstvíŽemlička&syn Pokudpotřebujemeuvnitřhodnotyatributupoužítzároveňuvozovkyiapostrofy,svýhodou využijemeodpovídajícíopisy " a '.XMLdefinujeještěpátouznakovouentitu >,kterázastupujeznak‚>‘.Tentoznakvšakvevětšiněpřípadůmůžemezapisovatpřímo beznutnostiopisu.1
Tabulka1.1:PředdefinovanéznakovéentityXML
Znak Entita
< < & & > > ' ' " "
JazykXMLdefinujepouzetěchtopětentit.Dalšíznakovéentity,kteréznámezHTML,jako například , © nebo –,vXMLkdispozicinejsou,nicméněsijemůžeme vpřípaděpotřebynadefinovatsami(viz1.13.1.1).
1 Opisjenutnýpouzevpřípadě,žebysevdokumentuvyskytovalasekvenceznaků‚]]>‘.Tasemusípřepsat jako ]]>
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á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á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<10;i++)
{ document.writeln("<p>Ahoj</p>"); }
</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" "> ]> <manuál> <název>&program;-Uživatelskápříručka</název> <odstavec>Program&program;můžetespustitvýběrempříkazuv 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" "> ]>
<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> <?php //ukázkovýskriptvPHP echo"Ahoj"; phpinfo(); ?> </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–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 , © a –).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.