Дефиниција типа документа


Дефиниција типа документа (енгл. Document Type Definition, ДТД) је скуп декларација за обележавање које дефинишу тип документа код језика за обележавање из SGML породице markup language (SGML, XML, HTML).

ДТД користи терцијалну формалну синтаксу, која декларише прецизно који елементи и референце могу да се појаве, и на ком месту у документу одређеног типа, као и који су садржај и атрибути ових елемената. DTD такође може да декларише ентитете који могу бити искоришњени у инстанци документа. Сврха DTD-а (Document Type Definition) је да дефинише дозвољене градивне елементе једног XML документа. Са DTD-ом, свака ваш XML датотека може носити опис свог формата. Са DTD-ом, независне групе људи могу се сагласити да користе стандардни DTD за размену података. Ваша апликација може употребљавати стандардни DTD како би проверила да су подаци, примљени из спољашњег света валидни. Такође, можете користити DTD за верификацију сопствених података.

Пример DTD-а, под именом Newspaper (новине):

<
<!DOCTYPE NEWSPAPER [

<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)> 

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> 
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

]>

Повезивање ДТД-ова са документима

уреди

Дефиниција типа документа (DTD) дефинише дозвољене градивне елементе XML докуемнта.
Дефинише структуру документа листом дозвољених елемената и атрибута.

DTD-ови имају два типа декларазија:

  • опционални екстерни подскуп
  • опционални интерни подскуп

Интерна DTD декларација

уреди

Уколико је DTD декларисан унутар самог XML фајла, потребно је да буде у DOCTYPE дефиницији са следећом синтаксом:

<!DOCTYPE root-element [element-declarations]> 
Пример XML документа ca интерним DTD:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

DTD написан изнад је интерпретиран на следећи начин:

  • !DOCTYPE note дефинише да је основа елемента овог документа note
  • !ELEMENT note дефинише да note елемент садржи четири елемента: "to,from,heading,body"
  • !ELEMENT to дефинише to елемент, и његов тип, "#PCDATA"
  • !ELEMENT from дефинише to елемент, и његов тип, "#PCDATA"
  • !ELEMENT heading дефинише to елемент, и његов тип, "#PCDATA"
  • !ELEMENT body дефинише to елемент, и његов тип, "#PCDATA"

Екстерна DTD декларација

уреди

Уколико је DTD декларисан у екстерном фајлу, потребно је да буде у DOCTYPE дефиницији, са следећом синтаксом:

<!DOCTYPE root-element SYSTEM "filename"> 

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

И ово је датотека "note.dtd", која садржи следећи DTD:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Градивни елементи XML докумената

уреди

Из DTD перспективе, сви XML документи (и HTML документи) су сачињени од следећих градивних елемената:

Елементи
Атрибути
Ентитети
PCDATA
CDATA

Елементи

уреди

Елементи су градивна основа и XML и HTML докумената. Примери HTML елемената су "body" и "table". Примери XML елемената би могли бити "note" или "message". Елементи могу садржати текст, друге елементе или бити празни. Примери празних HTML елемената су "hr", "br" и "img".

Примери:

неки текст</body>

<message>неки текст</message>

Атрибути

уреди

Атрибути пружају додатне информације о елементима.

Атрибути су увек постављени унутар тага за отварање елемента.
Атрибути су увек парног формата назив/вредност.
"img" елемент који следи има додатне информације о изворној датотеци:

<img src="computer.gif" />
Име елемента је "img". Име атрибута је "src". Вредност овог атрибута је "computer.gif". Пошто је сам елемент празан, затворен је симболом " /".

Ентитети

уреди

Неки карактери имају специјално значење у XML, као што је знак мање од (<), који дефинише почетак XML тага.

&nbsp Већина вас је упозната са HTML ентитетом: " ". Овај "размакница без преламања" ентитет је коришћен у HTML-у за убацивање додатног размака у документу.
Ентитети су проширени када је документ обрађен од стране XML анализатора.

Следећи ентитети су предефинисани у XML-у:
Референца ентитета - - - -Карактер
&lt-------------------------------------<
&gt------------------------------------>
&amp--------------------------------&
&quot--------------------------------"
&apos---------------------------------'

PCDATA значи “процесуирани подаци са карактерима
Посматрајте потатке са карактерима као текст који се налази између тага за отварање и затвањање у једном XML елементу.

PCDATA је текст који ће бити обрађен од стране анализатора.
Текст ће бити проверен, и претражен за ентитете и означавање.

Тагови унутар текста ће бити третирани као обележавање и ентитети ће бити проширени.

Међутим, обрађени подаци са карактерима неће садржати &, <, или > знакове; они морају бити представљени преко & < и > ентитета, редом.

CDATA значи “подаци са карактеримаCDATA је текст који неће бити обрађен од стране анализатора. Тагови унутар текста НЕЋЕбити третирани као обележавање и ентитети неће бити проширени.


DTD – Елементи

уреди

Декларисање елемената

У DTD-у, XML елементи су декларисани помоћу декларације елемента, са следећом синтаксом:

<!ELEMENT element-name category>
или
<!ELEMENT element-name (element-content)>


Празни елементи

уреди

Празни елементи су декларисани са кључном речи за категорију, EMPTY:

<!ELEMENT element-name EMPTY>

Пример:

<!ELEMENT br EMPTY>


XML пример:

<br />


Елементи са обрађеним подацима са карактерима

уреди

Елементи садржани само од обрађених података са карактерима су декларисани са #PCDATA унутар заграда.

<!ELEMENT element-name (#PCDATA)>


Пример:

<!ELEMENT from (#PCDATA)>


Елементи без икаквог садржаја

уреди

Елементи декларисани са кључном речи категорије ANY, могу да садрже било коју комбинацију обрадивих података:

<!ELEMENT element-name ANY>


Пример:

<!ELEMENT note ANY>


Елементи са децом (секвенце)

уреди

Елементи са једним или више детета су декларисани са именима њихове деце унутар заграда:

<!ELEMENT element-name (child1)>
или
<!ELEMENT element-name (child1,child2,...)>


Пример:

<!ELEMENT note (to,from,heading,body)>


Када су деца декларисана у секвенци раздвојеној зарезима, деца морају да се појаве у истом редоследу у документу.
У пуној декларацији, деца такође морају бити декларисана, и деца такође могу имати своју децу.
Пуна декларација "note" је онда:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Декларација само једног појављивања у елементу :

<!ELEMENT element-name (child-name)>


Пример:

<!ELEMENT note (message)>


Пример изнад декларише да деца елемента "message" морају да се појаве тачно једном унутар "note" елемента.


Декларисање барем једног појављивања у елементу:

<!ELEMENT element-name (child-name+)>


Пример:

<!ELEMENT note (message+)>


Знак + у овом примеру декларише да дете-елемент "message" мора да се појави једном или више пута унутар елемента "note".


Декларисање нула или више појављивања у елементу:
<!ELEMENT element-name (child-name*)>


Пример:

<!ELEMENT note (message*)>


Знак * у примеру изнад декларише да дете-елемент "message" може да се појави нула или више пута унутар "note" елемента.


Декларисање нула или једног појављивања елемента:
<!ELEMENT element-name (child-name?)>


Пример:

<!ELEMENT note (message?)>


Знак ? У примеру изнад декларише да дете-елемент "message" може да се појави једном или ниједном унутар елемента "note".

Декларисање или садржаја:

Пример:

<!ELEMENT note (to,from,header,(message|body))>


Пример изнад декларише да "note" елемент мора да садржи "to" елемент, "from" елемент, "header" елемент, и или "message" или "body" елемент.


Декларисање мешаног садржаја :

Пример:

<!ELEMENT note (#PCDATA|to|from|header|message)*>


Пример изнад декларише да елемент "note" може садржати нула или више појављивања обрађених података са карактерима, као и "to", "from", "header", или "message" елементе.


DTD - Атрибути

уреди

У DTD-у, атрибути су декларисани помоћу ATTLIST декларације.

Декларисање атрибута

уреди

Декларација атрибута има следећу синтаксу:

<!ATTLIST element-name attribute-name attribute-type default-value>


DTD пример:

<!ATTLIST payment type CDATA "check">


XML пример:

<payment type="check" />


attribute-type може бити једно од наведених:
Тип - - - - - - - - - - - - -Опис

CDATA--------------------Вредност података са карактерима
(en1|en2|..)--------------Вредност мора бити међу наведеним опцијама
ID----------------------------Вредност је јединствен id
IDREF----------------------Вредност је id другог елемента
IDREFS--------------------Вредност је листа других id вредности
NMTOKEN---------------Вредност је валидно XML име
NMTOKENS-------------Вредност је листа валидних XML имена
ENTITY--------------------Вредност је ентитет
ENTITIES-----------------Вредност је лист ентитета
NOTATION---------------Вредност је име нотације
xml: Вредност је предефинисана XML вредност

default-value може бити једно од наведених:
Вредност - - - - - -Објашњење

value - - - - - - - Подразумевана вредност атрибута
#REQUIRED-------Атрибут је неопходан
#IMPLIED----------Атрибут није неопходан
#FIXED value---- Атрибут је фиксан


Подразумевана вредност атрибута
DTD:

<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">


Валидни XML:

<square width="100" />


У примеру изнад, "square" елемент је дефинисан као празан елемент са "width" атрибутом, типа CDATA.
Уколико вредност није задата, има подразумевану вредност 0.


#REQUIRED
Cинтакса:

<!ATTLIST element-name attribute-name attribute-type #REQUIRED>


Пример
DTD:

<!ATTLIST person number CDATA #REQUIRED>


Валидан XML:

<person number="5677" />


Неисправан XML:

<person />


Употребљавајте #REQUIRED кључну реч уколико немате могућност за подразумевану вредност, али свеједно желите да приморате да атрибут буде присутан.


#IMPLIED Синтакса

<!ATTLIST element-name attribute-name attribute-type #IMPLIED>


Пример
DTD:

<!ATTLIST contact fax CDATA #IMPLIED>


Исправан [[[XML]]:

<contact fax="555-667788" />


Неисправан XML:

<contact />


Користите #IMPLIED кључну реч уколико не желите да приморате аутора да укључи атрибут, иако немате могућност за подразумевану вредност.


#FIXED
Синтакса

<!ATTLIST element-name attribute-name attribute-type #FIXED "value">


Пример
DTD:

<!ATTLIST sender company CDATA #FIXED "Microsoft">


Исраван XML:

<sender company="Microsoft" />


Неисправан XML:

<sender company="W3Schools" />


Користите #FIXED кључну реч када желите да атрибут има фиксирану вредност без могућности да је аутор измени.
Уколико аутор укључи неку другу вредност, XML анализатор ће избацити поруку о грешци .


Пребројиве вредности атрибута
Синтакса

<!ATTLIST element-name attribute-name (en1|en2|..) default-value>


Пример
DTD:

<!ATTLIST payment type (check|cash) "cash">


XML пример:

<payment type="check" />
или
<payment type="cash" />


Користите пребројиве вредности атрибута када желите да вредност атрибута буде једна из фиксираног скупа дозвољених могућности.


XML елементи наспрам атрибута: У XML-у, не постоје правила када треба користити атрибуте, а када децу-елементе.


Употребе Елементи наспрам атрибута:
Подаци могу бити уписани у деци-елементима или атрибутима:

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person> 

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>


У првом примеру, пол је атрибут. У другом, пол је дете-елемент. Оба примера пружају исте информације.

Не постоје правила за то када користити атрибуте а кад децу-елементе.
Атрибути су згодни у HTML-у, али у XML-у би требало избегавати их.
Користите децу-елементе уколико информације изгледају као подаци.

Неки проблеми са атрибутима су:

  • атрибути не могу да садрже више вредности (деца-елементи могу).
  • атрибути нису лако проширивие (за будуће промене).
  • атрибути не могу да описују структуре (деца-елементи могу).
  • атрибути су тежи за манипулацију од стране програмског кода.
  • вредности атрибута нису тако лако провериве по DTD-у.

DTD - Ентитети

уреди

Ентитети су променљиве, коришћене за дефинисање пречица за стандардни текст или специјалне карактере:

•Референце ентитета су референце ка ентитетима.
•Ентитети могу бити декларисани интерно или екстерно.

Интерна декларација ентитета
Синтакса

<!ENTITY entity-name "entity-value">


Пример
DTD пример:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">



XML пример:

<author>&writer;&copyright;</author>


Напомена Eнтитет има три дела: амперсенд (&), име ентитета , и тачку-зарез (;).

Екcтерна декларација ентитета

Синтакса

<!ENTITY entity-name SYSTEM "URI/URL">


DTD пример:

<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">


XML пример:

<author>&writer;&copyright;</author>



DTD - примери :


ТV Schedule (ТВ програм) DTD

<!DOCTYPE TVSCHEDULE [

<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)> 
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>



Newspaper Article (Новински чланак) DTD

<!DOCTYPE NEWSPAPER [

<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">

]>



Product Catalog (Каталог производа) DTD

<!DOCTYPE CATALOG [

<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">

<!ELEMENT CATALOG (PRODUCT+)>

<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">

<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>

<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">

<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>

<!ELEMENT NOTES (#PCDATA)>

]>



Спољашње везе

уреди