XML a DTD Kapitola seznamuje se specifikací souboru XML pomocí souboru DTD Klíčové pojmy: Definice typu dokumentu. DTD DEFINICE TYPU DOKUMENTU slouží k bližší definici XML dokumentu textový soubor s uvedenými pravidly, které musí odpovídající soubor XML splňovat určuje blíže jeho strukturu, specifikuje druh dat, které mohou jeho elementy dále obsahovat validaci XML dokumentu oproti DTD dokumentu provedeme pomocí některého z webových validátorů, oba soubory do něj nahrajeme a validátor případně vypíše chyby XML vůči DTD Umístění vůči XML interní deklarace: <!DOCTYPE kořenový_element [deklarace definující vlastnosti jednotlivých elementů a atributů]> externí deklarace: <!DOCTYPE kořenový_element SYSTEM adresa_souboru_s_dtd > <!DOCTYPE Clanek SYSTEM clanek.dtd > <!ELEMENT> = DEKLARACE ELEMENTŮ <!ELEMENT název_elementu obsah_elementu> Obsah elementu: EMPTY... musí být prázdný ANY... element může obsahovat cokoliv nebo musíme uvést model elementu (určuje, jaké elementy a v jakém pořadí se mohou uvnitř deklarovaného elementu objevit, uzavřena v () + obsahuje alespoň 1 další symbol) sekvence elementů = seznam oddělený čárkami = všechny elementy v daném pořadí volba, výběr z elementů = odděleno = jeden z elementů skupiny elementů = v závorkách výskyt elementu =?... 0 nebo1 krát +... 1 a vícekrát *... 0 a vícekrát #PCDATA... element může obsahovat většinou jen běžný text nebo text a elementy, pokud obsahuje i vnořené elementy, musí být #PCDATA uvedeno jako první a celá skupina musí být volitelná a opakovatelná <!ELEMENT odstavec (#PCDATA seznam)*> 2011-10-12 XML a DTD 1/6
<!ATTLIST> = DEKLARACE ATRIBUTŮ ATRIBUT je dodatečnou informací o elementu, jmeno_atributu= hodnota_atributu Uvádí se seznam všech atributů daného elementu: <!ATTLIST název_elementu jméno_atributu1 typ_atributu modifikátor jméno_atributu2 typ_atributu modifikátor... > Typ atributu: řetězcový typ = jakýkoliv řetězec ohraničený uvozovkami CDATA... řetězec znaků symbolový typ = různé druhy, řetězec ohraničený uvozovkami ENTITY... název entity deklarované v DTD, většinou odkazuje na externí soubor, obrázek ID... jedinečný identifikátor IDREF... odkaz na unikátní id jiného atributu IDREFS... odkazy na více identifikátorů oddělených mezerou nebo formátovacím znakem vyjmenovaný typ = jedna z hodnot v seznamu NMTOKEN... identifikátor, slovo bez mezer, může začínat i číslicí, hodnotou atributu musí být název symbolů složený z písmen číslic, teček,-,_,: NMTOKENS... seznam hodnot typu NMTOKEN skupina jmen, je možné uvést standardní hodnotu: <!ATTLIST odstavec zarovnani (vlevo vpravo blok) blok > NOTATION... které dat. typy mohou být do elem. vkládány <!ATTLIST dokument format NOTATION (html sgml rtf) #REQUIRED > Modifikátor atributu: #REQUIRED... atribut je povinný #IMPLIED... atribbut nepovinný, nebude pak nahrazen žádnou hodnotou, neočekává se určitá standardní hodnota #FIXED hodnota... výchozí hodnota atributu, při vynechání atributu bude nahrazen touto hodnotou <!ENTITY> = DEKLARACE ENTIT ENTITA je něco jsoucího v XML se vše dělí na entity uzavřený celek, i data, která nejsou ve formátu XML musí mít přiřazeno jméno musí být deklarována pomocí speciálního zápisu = deklarace entity, obsahuje obsah entity nebo odkaz na soubor, kde je obsah uchován v textu je uveden odkaz na entitu, ten se pak nahradí obsahem entity nesmí odkazovat sama na sebe vhodné když: stejný obsah na více místech 2011-10-12 XML a DTD 2/6
rozčlenění velkého dokumentu data v jiném formátu než XML Typy entit: obecné/všeobecné obsahuje text/text XML/netextová data je možné použít v DTD i v XML dokumentu, začínají znakem & <!ENTITY název_entity definice/obsah_entity > <!ENTITY titul Historie XML <podtitul>budoucnost jayzka na internetu</podtitul> > parametrické obsahuje text xml lze použít pouze v DTD, začínají % <!ENTITY % název_entity definice/obsah_entity > interní obsahuje ohraničený řetězec deklarace entity obsah entity je uveden v DTD externí obsad je uložen mimo DTD obecná externí entita: <!ENTITY název_entity SYSTEM umístění souboru obsahem entity > analyzovatelné... textové obsahuje XML text po vložení je zaměněna za obsah entity neanalyzovatelné... binární může obsahovat jakýkoliv typ dat, většinou xml, proto nelze vložit přímo do dokumentu Neparametrické entity deklarace entity v dtd: <!ENTITY aautor "Lenka Hrušková"> <!ENTITY bautor "Lenka Hrušková, 2006"> použití entity v xml: <autor>&aobsah;</autor> <copyright>&bobsah;</copyright> Parametrické entity deklarace entity v dtd <!ENTITY %ident "identifikator ID #REQUIRED"> použití entity v dtd <!ATTLIST titulek %ident;> v textu je pak %ident; nahrazeno textem identifikator ID #REQUIRED 2011-10-12 XML a DTD 3/6
<!NOTATION> = DEKLARACE NOTACÍ NOTACE úzce souvisí s entitou jejím hlavním úkolem je přidat informaci o typu obsahu neanalyzovatelné entity pomůže zvolit prostředek ke zpracování obsahu entity (neanalyzovatelná entita je pro xml "neprůhledná") identifikuji notaci pomocí deklarace entity: <!ENTITY název_ext_entity SYSTEM umístění souboru NDATA id> SYSTEM... entita je uložena v jiném/externím souboru umístění souboru... může být relativní/absolutní cesta nebo URL NDATA... jedná se o notační data id... slovo identifikující notaci pak mohu definovat notaci s názvem id: <!NOTATION id SYSTEM info o tom, co vkládaná data obsahují > příklad: <!ENTITY Obrazek1 SYSTEM domecek.gif NDATA gif> <!NOTATION gif SYSTEM image/gif > <!ENTITY Obrazek2 SYSTEM auto.gif NDATA jpg> <!NOTATION jpg SYSTEM image/jpeg > volání neanalyzovatelné entity: <Obrazek zdroj="obrazek1"> element i atribut pak musí být také deklarován: <!ELEMENT Obrazek1 EMPTY> <!ATTLIST Obrazek1 zdroj ENTITY #REQUIRED> 2011-10-12 XML a DTD 4/6
JAK POSTUPOVAT PŘI TVORBĚ DTD 1. Kořenový element 1a. definice entit (clanek má potomky titulek, datum,...=> napíšeme seznam částí elementu clanek) <!ELEMENT clanek (titulek, datum, autor, copyright, perex, odstavec+, seznam, zaver)> 1b. definice atributů kořenového elementu: <!ATTLIST clanek cislo_clanku CDATA #REQUIRED verze CDATA #REQUIRED misto_zverejneni CDATA #REQUIRED> 2. Definujeme jednotlivě potomky kořenového elementu 2a. definice entit pokud mají potomky, definujeme je (element seznam obsahuje ještě elementy otazka a seznam1): <!ELEMENT seznam (otazka*, seznam1)> pokud už nemají potomky, definujeme obsah, většinou řetězec (#PCDATA) <!ELEMENT titulek (#PCDATA)> <!ELEMENT datum (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT copyright (#PCDATA)> <!ELEMENT perex (#PCDATA)> <!ELEMENT odstavec (#PCDATA)> <!ELEMENT zaver (#PCDATA)> 3. Potomci potomků element seznam obsahuje další element - otazka1: <!ELEMENT seznam1 (otazka1*)> element otazka1 je již pouze text: <!ELEMENT otazka1 (#PCDATA)> definice entit - parametrických <!ENTITY aobsah "Lenka Hrušková"> definice entit - neparametrických <!ENTITY %ident "identifikator ID #REQUIRED"> použití entit - neparametrických <!ATTLIST titulek %ident;> deklarace neanalyzovatelných entit <!ENTITY Obrazek1 SYSTEM auto.gif NDATA jpg> <!NOTATION jpg SYSTEM image/jpeg > <!ELEMENT Obrazek1 EMPTY> <!ATTLIST Obrazek1 zdroj ENTITY #REQUIRED> 2011-10-12 XML a DTD 5/6
Ukázka DTD souboru pro adresar.xml <?xml version="1.0" encoding="windows-1250"?> <!ELEMENT adresar ((info)?, (zaznam)*)> <!ELEMENT info (majitel, (vznik)?, (poznamka)?)> <!ELEMENT majitel (#PCDATA)> <!ELEMENT vznik (#PCDATA)> <!ELEMENT poznamka (#PCDATA)> <!ELEMENT zaznam ((firma)?, (osoba)?, (adresa)*, (email)*, (telefon)*, (web)*, (icq)*, (narozen)?, (klicslova)?, (poznamka)?)> <!ELEMENT firma (#PCDATA)> <!ATTLIST firma obor CDATA #IMPLIED> <!ELEMENT osoba ((titul)?, (jmeno)?, (prijmeni)?, (prezdivka)*, (titulza)?)> <!ELEMENT titul (#PCDATA)> <!ELEMENT jmeno (#PCDATA)> <!ELEMENT prijmeni (#PCDATA)> <!ELEMENT prezdivka (#PCDATA)> <!ELEMENT titulza (#PCDATA)> <!ELEMENT adresa (ulice, ((psc, mesto) (mesto, psc)), (stat)?, (poznamka)?)> <!ATTLIST adresa typ (soukromá firemní) "soukromá"> <!ELEMENT ulice (#PCDATA)> <!ELEMENT mesto (#PCDATA)> <!ELEMENT psc (#PCDATA)> <!ELEMENT stat (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ATTLIST email typ (soukromý firemní) "soukromý"> <!ELEMENT web (#PCDATA)> <!ATTLIST web typ (soukromý firemní) "soukromý"> <!ELEMENT icq (#PCDATA)> <!ELEMENT telefon (#PCDATA)> <!ATTLIST telefon typ (domu mobil fax firma) #IMPLIED> <!ATTLIST telefon poznamka CDATA #IMPLIED> <!ELEMENT narozen (#PCDATA)> <!ELEMENT klicslova (#PCDATA)> 2011-10-12 XML a DTD 6/6