Tópicos de Sistemas de Informação A Carlos Oberdan Rolim Ciência da Computação Validação de documentos XML Um documento é válido com relação a um dado esquema XML se obdece este esquema Documento XML Parser Esquema XML Documento XML válido Documento XML inválido Linguagens de Esquemas XML DTD – Document Type Definition XML Schema XML DTD Document Type Definition O que é ? A estrutura de um documento XML é definida no Document Type Definition (Definição do Tipo de Documento), que especifica o conjunto de elementos do documento, seus relacionamentos, seus atributos, entidades e o conjunto de tags associadas para marcar o documento. Função A principal função do DTD é definir todas as tags que um documento XML pode conter, determinando a ordem em que elas devem aparecer e se são obrigatórias ou opcionais Define uma gramática para validar documentos, isto é, conjunto de regras que definem a estrutura do documento Descreve a estrutura da árvore que pode ser aceita para o documento A validação compara um documento em particular com uma DTD correspondente É necessário que um documento seja bem-formado para ser validado Exemplos de aplicação registros médicos enciclopédias catálogos de produto jornais dicionários contratos políticas e procedimentos artigos científicos ordens de compra normas/regulamentos manuais de usuário Componentes de um documento DTD Componentes Definição Elementos Refere-se a qualquer tag criada, ou seja, qualquer cadeia de caracteres contida dentro dos delimitadores < e >. Tags São os elementos marcadores que possuem abertura e encerramento. Atributos Fornece informações extras sobre os elementos e são inseridos nas tags iniciais de um elemento. Entidades São variáveis designadas para conter textos ou documentos. Ao realizar a construção do DTD, é necessário que exista um entendimento muito claro do que se pretende armazenar nos documentos XML, ou seja, qual tipo de informação eles vão guardar e todos os outros elementos envolvidos citados anteriormente. Validação Com o DTD é possível ao software processador da XML realizar a validação de um documento, verificando se ele foi criado corretamente, segundo os padrões estabelecidos. HTML x XML Quando a HTML é utilizada em uma página da Web, não existe a necessidade de realizar uma declaração do tipo de documento, ou seja, atrelá-la a um DTD. Uma vez que suas tags são fixas, estas são controladas internamente pelo próprio browser. Já o XML, por sua vez, devido a características de permitir a criação de tags, obriga a criação do DTD, para que o browser, ou qualquer outro interpretador XML, possa verificar a validade das tags utilizadas. XML DTD <company> <!DOCTYPE company [ <person> <ssn> 123456789 </ssn> <!ELEMENT company ((person|product)*)> <name> John </name> <!ELEMENT person (ssn, name, office, phone?)> <office> B432 </office> <!ELEMENT ssn (#PCDATA)> <phone> 1234 </phone> <!ELEMENT name (#PCDATA)> </person> <!ELEMENT office (#PCDATA)> <person> <ssn> 987654321 </ssn> <!ELEMENT phone (#PCDATA)> <name> Jim </name> <!ELEMENT product (pid, name, description?)> <office> B123 </office> <!ELEMENT pid (#PCDATA)> </person> <!ELEMENT description (#PCDATA)> <product> ... </product> ]> ... </company> Browser validando um documento XML Formas de declaração do DTD A definição das regras de um DTD, não necessita estar armazenada obrigatoriamente em um arquivo externo. Ela pode ser interna, ou seja, definida dentro do próprio documento XML, ou ainda uma parte interna e outra externa. Declaração Sintaxe: <!ELEMENT nome-do-elemento (lista de elementos e condições)> Onde: <!ELEMENT: palavra reservada que indica a declaração de um elemento, tag. A utilização de letra maiúscula na palavra ELEMENT é obrigatória. Nome-do-elemento: nome da tag. Lista de elementos: nome de todas as tags que podem ser utilizadas dentro da tag que está sendo declarada. Condições: caracteres que são utilizados para indicar opcionalidade e obrigatoriedade para as tags. Caracteres de condições utilizados na declaração dos elementos Caractere de Condição Função + Indica que o elemento filho será utilizado pelo menos uma vez dentro do elemento pai (ou mais de uma). (Mais) * (Asterisco) ? (Interrogação) | (Barra Vertical) Indica que o elemento filho será utilizado várias vezes dentro de um elemento pai, ou nem será utilizado (nenhuma ou mais de uma). Indica que o elemento filho será opcional, podendo ou não ser utilizado (uma única vez) dentro do elemento pai. Indica que um ou outro elemento filho será utilizado dentro de um elemento pai. Posições dos caracteres de condição Posições dos caracteres de condição <!ELEMENT cartao (nome, telefone+, email*, website?)> <!ELEMENT livro (titulo, autor, editora, ano)*> <!ELEMENT trecho (ferroviário | aéreo | rodoviário | fluvial)> Posições dos caracteres de condição Caractere de Condição Exemplo <!ELEMENT cliente (nome, fone+)> + (Mais) <cliente> <cliente> <nome>... </nome> <fone> ... </fone> </cliente> <nome> ... </nome> <fone> ... </fone> <fone> ... </fone> </cliente> <!ELEMENT cliente (nome, fone*)> <cliente> * (Asterisco) <cliente> <nome>... </nome> </cliente> <nome> ... </nome> <fone> ... </fone> <fone> ... </fone> </cliente> Caractere de Posições dos caracteres de condição Exemplo Condição <!ELEMENT cliente (nome, fone?, email?)> <cliente> <cliente> <nome>...</nome> ? </cliente> <nome> ... </nome> <fone> ... </fone> </cliente> (Interrogação) <cliente> <cliente> <nome>... </nome> <email>... </email> </cliente> <nome> ... </nome> <fone> ... </fone> <email> ... </email> </cliente> <!ELEMENT cliente (nome, (fone|email))> | (Barra Vertical) <cliente> <cliente> <nome>... </nome> <nome> ... </nome> <fone> ... </fone> <email> ... </email> </cliente> </cliente> Variações na declaração dos elementos Declaração de Sintaxe Elementos que possuem apenas texto. Única ocorrência para um elemento. Elementos que <!ELEMENT nome-do-elemento (#PCDATA)> <!ELEMENT nome-do-elemento (elemento_1)> possuem <!ELEMENT nome-do-elemento (elemento_1, elementos filhos. elemento_2, elemento_3, elemento_4)> Ocorrência de um, os dois, vários de cada um, ou nenhum dos <!ELEMENT nome-do-elemento (elemento_1, elementos para o elemento elemento_2)*> principal. *PCDATA = Parsable Character Data Variações na declaração dos elementos Declaração de Sintaxe Semelhante a anterior, porém pelo menos um elemento deve <!ELEMENT nome-do-elemento (elemento_1, existir dentro do elemento elemento_2)+> principal. Elemento principal pode ser vazia ou conter apenas um dos elementos. <!ELEMENT nome-do-elemento (elemento_1, elemento_2)?> Atributo no documento DTD Sintaxe <!ATTLIST elemento atributo1 tipo valor_default> <!ATTLIST elemento atributo2 tipo valor_default> ou então <!ATTLIST elemento atributo1 tipo valor_default atributo2 tipo valor_default> Atributo no documento DTD <!ATTLIST automovel marca NMTOKEN #IMPLIED > <!ATTLIST automovel modelo CDATA #FIXED "1000"> <!ATTLIST automovel ano NMTOKEN #REQUIRED > <!ATTLIST automovel marca NMTOKEN #IMPLIED modelo CDATA #FIXED “1000" ano NMTOKEN #REQUIRED> Tipos de dados CDATA (character data): representa qualquer texto. Pode conter espaços, pontuação, etc. NMTOKEN (name token): caracteres alfanuméricos. Não pode conter espaços. NMTOKENS: representa um ou mais NMTOKEN separados por espaços. ID: tem que conter um nome que seja unívoco no documento. IDREF: é referência para um ID. IDREFS: lista de elementos IDREF. CDATA O valor de um atributo do tipo String é uma cadeia de caracteres de qualquer tamanho Ex.: <!ATTLIST livro titulo CDATA> Definição do atributo nome <livro titulo=“Data replication”/> Exemplo válido de elemento produto ID Os IDs identificam unicamente elementos individuais em um documento Todos os valores usados para IDs em um documento devem ser diferentes Os elementos podem ter um único atributo ID O valor de um atributo do tipo ID deve ser único em um documento XML a fim de que o documento seja válido Ex.: <!ATTLIST livro ISBN ID> Definição do atributo codigo <livro ISBN=“123”/> Exemplo válido de elemento produto IDREF O valor de um atributo IDREF deve ser o valor de um único atributo ID algum elemento no documento Ex.: <!ATTLIST livro bib IDREF> Definição do atributo <livro bib=“123”/> Documento válido IDREFS É uma variação do tipo IDREF O valor de um atributo IDREFS pode conter valores IDREF múltiplos separados por espaços em branco. Ex.: <!ATTLIST livro bib IDREFS> Definição do atributo <livro bib=“123 456”/> Documento válido Valores default #REQUIRED preenchimento obrigatório para o atributo. <!DOCTYPE livro [ <!ELEMENT livro EMPTY> <!ATTLIST livro titulo CDATA #REQUIRED]> <livro titulo = “Data Replication”/> #IMPLIED o atributo é opcional. <!DOCTYPE livro [ <!ELEMENT livro EMPTY> <!ATTLIST livro titulo CDATA #IMPLIED]> <livro titulo = “Data Replication”/> #FIXED o atributo tem um valor fixo. Não pode se alterado. <!ATTLIST valor moeda CDATA #FIXED “R$"> Entidades Entidades podem ser usadas para representar caracteres especiais As entidades também são usadas para referenciar um texto freqüentemente repetido ou alterado Existem diferentes tipos de entidades: Entidades gerais ou de parâmetro Entidades internas ou externas Entidades gerais e de parâmetro Entidades Gerais Referências de entidades gerais podem aparecer em qualquer lugar no texto ou na marcação Geralmente são usadas como abreviação para um texto As entidades gerais externas podem referenciar outros documentos em formato que não seja XML <!DOCTYPE manual [ <!ENTITY Direitos “<p> Este produto é fabricado pela &companhia;. </p>”> <!ENTITY companhia “Intel”> <!ELEMENT manual (p)+> <!ELEMENT p (#PCDATA)> ]> <manual> <p> Este é o manual da &companhia; </p> &Direitos; </manual> Entidades gerais e de parâmetro Entidades de parâmetro Referências de entidade de parâmetro só podem aparecer na DTD Existe um caractere extra na declaração antes do nome da entidade As referências de entidade de parâmetro também substituem o símbolo & pelo sinal % <!ENTITY % boolean “(true|false) ‘false’ “> <!ELEMENT telefone (#PCDATA)> <!ATTLIST telefone preferido %boolean; > Entidades Internas e Externas Entidades internas São armazenadas no documento Permitem definir atalhos para textos freqüentemente digitados ou textos a serem alterados Entidades externas Apontam para um identificador Referenciam um conteúdo que não faz parte do documento atual <!DOCTYPE manual [ <!ENTITY maria SYSTEM “maria.ent”> <!ENTITY pedro SYSTEM “pedro.ent”> <!ELEMENT agenda (item)+>]> <agenda> &maria; &pedro; </manual> <item> <nome> Maria da Silva </nome> <fone> 234.4567 </fone> </item> <item> <nome> Pedro Soares </nome> <fone> 256.8934 </fone> </item> Associação de XML com DTD Digitar após esta linha <?xml version="1.0" encoding=“iso-8859-1"?> a seguinte declaração: <!DOCTYPE elemento_raiz SYSTEM “nome arquivo"> Em que: !DOCTYPE vincula o DTD a um documento elemento_raiz será o nome do elemento principal do documento XML nome_arquivo é o nome do arquivo que contém o DTD Associação de XML com DTD <!DOCTYPE biblioteca SYSTEM “biblioteca.dtd"> Indica ao processador XML que ele deverá verificar sua validade por meio do arquivo biblioteca.dtd, ou seja, a declaração indica que o DTD do documento presente, cujo elemento principal é “biblioteca”, está disponível no arquivo biblioteca.dtd. DTD Interno É possível que se insiram as regras do DTD no próprio documento XML. As regras devem ser inseridas entre [ e ]. Externa: <!DOCTYPE biblioteca SYSTEM “biblioteca.dtd"> Interna: <!DOCTYPE biblioteca[ <!ENTITY % tipo “(#PCDATA)”> <!ELEMENT biblioteca(livro+) > <!ELEMENT livro (titulo, autor+, paginas) > <!ELEMENT titulo %tipo; > <!ELEMENT autor %tipo; > <!ELEMENT paginas %tipo; > <!ATTLIST livro genero CDATA #REQUIRED > ]> DTD Misto Podem ser usadas em conjunto: <!DOCTYPE exemplo SYSTEM “biblioteca.dtd" [ <!ENTITY valor “R$"> ]> * Definições internas sobrepõem elementos já existentes na DTD externa. Criando um DTD Avaliar a estrutura do documento XML Identificar elemento principal/raiz Identificar elementos filhos Exercício Criar DTD externo para o seguinte XML e validar o documento <?xml version=”1.0” encoding=”UTF8”?> <!DOCTYPE BOOK SYSTEM “book.dtd”> <BOOK> <TITLE> O nome da Rosa </TITLE> <AUTHOR> <FULL_NAME> Umberto Eco </FULL_NAME> </AUTHOR> <ISBN> 01233440 </ISBN> <PUBLISHER>Recordx </PUBLISHER > <VENDOR_LIST> <VENDOR order=”1” availableOnline=”yes”> <NAME> Amazon.com </NAME> <PHONE> (800)555-1212 </PHONE > <PHONE> (800)555-1313 </PHONE > <BOOK_PRICE> $24.95 </BOOK_PRICE > </VENDOR> <VENDOR order=”2” availableOnline=”no”> <NAME> Border’s </NAME> <PHONE> (800)615-1313 </PHONE > <BOOK_PRICE > $22.36 </BOOK_PRICE> </VENDOR> </VENDOR_LIST> </BOOK>