Linguagens para Organização e
Transferência de Dados na Web
DTD.
https://sites.google.com/site/thiagoaalves/
DTD
Um DTD (Document Type Definition)
especifica um conjunto de regras que
define a estrutura de um documento
XML.
DTD
O DTD pode aparecer no topo do XML ou
em um documento separado.
◦
<?xml version="1.0"?>
◦
<!DOCTYPE note [
◦
<!ELEMENT note
(to,from,heading,body)>
◦
<!ELEMENT to (#PCDATA)>
◦
<!ELEMENT from (#PCDATA)>
◦
<!ELEMENT heading (#PCDATA)>
◦
<!ELEMENT body (#PCDATA)>
DTD
Se você optar por inserir o DTD dentro
do documento XML um problema que
pode acontecer:
◦
se vários documentos XML utilizarem o
mesmo DTD, você vai precisar atualizar cada
XML sempre que o DTD sofrer alterações.
Uma solução é criar um arquivo externo
ao XML que contém o DTD, e em cada
XML fazer uma referência ao DTD.
DTD
Exemplo de um Documento XML com 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
Arquivo note.dtd
<!ELEMENT note
(to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
DTD
Como no XML o arquivo tem que ser
salvo com a extensão que do formato.
Todo arquivo que for um DTD tem que
ser acompanhado da extensão .dtd.
DTD
Exemplo de um documento que apresenta XML e
DTD separados:
Exemplo.xml
<?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>
DTD
Arquivo note.dtd
<!ELEMENT note
(to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
DTD
Sintaxe de um DTD
Um DTD defini um documento XML da seguinte
maneira:
◦ Declaração de um conjunto de elementos. Você não pode utilizar outros elementos que não estejam definidos neste conjunto. Imagine como se fosse o vocabulário do XML.
◦ Definição do conteúdo para cada elemento. A definição de conteúdo é um padrão que nos diz quais os elementos ou dados que aquele determinado elemento XML pode
conter, em qual ordem, quantidade e se é opcional ou obrigatório. Imagine como se fosse a gramática do XML.
◦ Declaração de um conjunto de atributos para cada
elemento. Cada declaração de atributo define o nome, tipo (datatype), valores padrões (se aplicável), e
DTD
Estrutura de um DTD
O DTD é um conjunto de regras, também
chamadas de declarações. Cada
declaração especifica um elemento, seus
atributos, entidades e conteúdo.
DTD
Declaração dos elementos do XML
Cada elemento que você for usar no
documento XML deve ser declarado no
DTD. Uma declaração de elemento faz duas
coisas: adiciona um novo nome de
elemento ao vocabulário da linguagem e
documenta qual é o conteúdo desse
elemento. Juntos (novo elemento +
conteúdo), criam uma gramática para
a linguagem, um padrão para determinar
DTD - Exemplo
<?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
O nome do elemento é case-sensitive.
O elemento Casa é diferente do
elemento CASA ou casa. Por
convenção, nome de elementos são
sempre lowercase (letras minúsculas).
DTD
Um elemento XML pode conter cinco
tipos diferentes de conteúdo:
◦
Elementos vazios: a maneira mais simples de
declarar um elemento vazio é através da
palavra-chave EMPTY. Exemplo: <!ELEMENT
grafico EMPTY>;
DTD
◦
Elementos que não contém restrições de
conteúdo: neste tipo de declaração, o
elemento XML pode conter qualquer outro
elemento. Neste caso, é utilizada a
palavra-chave ALL.
Exemplo: <!ELEMENT
contem_qualquer_coisa ALL> (Obs. Pode ser
que com ALL não funcione tente ANY);
DTD
◦
Elementos que podem conter apenas dados
do tipo texto (informação): Para elementos
que apenas podem conter informação, mas
não outros elementos, utiliza-se
(#PCDATA), que significa “parsed-character
data”. Isso significa que os caracteres serão
verificados por um parser XML à procura de
referências de entidades, e caso houver
alguma, então esta entidade será substituída
por seu valor correspondente. Forma mais
comum para a criação de Elementos XML.
DTD
◦
Elementos que podem contem apenas outros
elementos: para declarar elementos dentro de
um outro elemento, utiliza-se uma notação
especial, descrita na lista abaixo:
, -> Descreve uma sentença obrigatória de elementos.
Também funciona como operador E (AND). Exemplo: A,B significa que B deve vir depois de A. B seguido de A não é permitido.
| -> Descreve uma alternativa, funciona como o
operador OU (OR). Exemplo: A|B|C significa que qualquer elemento é aceitável. Apenas uma opção é permitida, você deve escolher entre um dos três elementos.
DTD
(…) -> Agrupa o conteúdo. Você pode usar a
quantidade e parênteses que for preciso. Exemplo:
(A|B), C significa que você deve escolher entre A ou
B, e este deve ser seguido por um C. Portanto,
tanto A C e B C são permitidos.
? -> Descreve uma sentença opcional. Exemplo: A ?
significa que você pode escolher se vai usar ou não
o elemento A.
+ -> Requere que pelo menos uma vez o elemento
seja declarado, e não limite de quantas vezes este se
repete. Exemplo: (A|B)+ significa que deve haver um
número positivo e diferente de zero de As ou Bs. A
sequência ABBBAAA é válida.
DTD
* -> Significa que o elemento pode aparecer várias
vezes, não tendo limite, e também é opcional.
Exemplo: (A|B)* significa que a sequência pode ter
tamanho zero e pode ter inúmeros elementos A ou
B.
DTD
◦
Elementos com conteúdo misto: conteúdo
misto é quando um elemento pode conter
tanto elementos quanto informação. Um
elemento desse tipo deve ser declarado como
no exemplo abaixo:
A palavra chave ELEMENT deve vir primeiro,
seguido do nome do elemento, e após este, a lista
dos elementos permitidos e #PCDATA, separados
por uma barra vertical ( | ), limitados por
DTD
Mas como criar um XML com vários
arquivos, nos exemplos anteriores a
criação só permitia ou só demonstrava a
utilização de somente um registro.
Para isso vamos analisar o seguinte
DatabaseInventory.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT DatabaseInventory (DatabaseName+)> <!ELEMENT DatabaseName ( GlobalDatabaseName
, OracleSID , DatabaseDomain , Administrator+ , DatabaseAttributes , Comments) >
<!ELEMENT GlobalDatabaseName (#PCDATA)> <!ELEMENT OracleSID (#PCDATA)>
<!ELEMENT DatabaseDomain (#PCDATA)> <!ELEMENT Administrator (#PCDATA)> <!ELEMENT DatabaseAttributes EMPTY> <!ELEMENT Comments (#PCDATA)>
DTD
Ok essa foi a criação do DTD agora
DatabaseInventory.xml
<?xml version="1.0"?>
<!DOCTYPE DatabaseInventory SYSTEM "DatabaseInventory.dtd"> <DatabaseInventory>
<DatabaseName>
<GlobalDatabaseName>production.iDevelopment.info</GlobalDatabaseName> <OracleSID>production</OracleSID>
<DatabaseDomain>iDevelopment.info</DatabaseDomain>
<Administrator EmailAlias="jhunter" Extension="6007">Jeffrey Hunter</Administrator> <DatabaseAttributesType="Production" Version="9i"/>
<Comments>
The following database should be considered the most stable for up-to-date data. The backup strategy includes running the database in Archive Log Mode and performing nightly backups. All new accounts need to be approved by the DBA Group before being created.
</Comments> </DatabaseName>
DTD
<DatabaseName> <GlobalDatabaseName>development.iDevelopment.info</GlobalDatabase Name> <OracleSID>development</OracleSID> <DatabaseDomain>iDevelopment.info</DatabaseDomain> <Administrator EmailAlias="jhunter" Extension="6007">JeffreyHunter</Administrator>
<Administrator EmailAlias="mhunter" Extension="6008">Melody
Hunter</Administrator>
<DatabaseAttributes Type="Development" Version="9i"/> <Comments>
The following database should contain all hosted applications.
Production
data will be exported on a weekly basis to ensure all development
environments
have stable and current data. </Comments>
DTD
<DatabaseName> <GlobalDatabaseName>testing.iDevelopment.info</GlobalDatabaseName > <OracleSID>testing</OracleSID> <DatabaseDomain>iDevelopment.info</DatabaseDomain> <Administrator EmailAlias="jhunter" Extension="6007">JeffreyHunter</Administrator>
<Administrator EmailAlias="mhunter" Extension="6008">Melody
Hunter</Administrator>
<Administrator EmailAlias="ahunter">Alex Hunter</Administrator> <DatabaseAttributes Type="Testing" Version="9i"/>
<Comments>
The following database will host more than half of the testing for our hosting environment.
</Comments> </DatabaseName>