MARCUS BARBOSA PINTO
UMA PROPOSTA PARA INTEGRAÇÃO DE ESQUEMAS
PARA DOCUMENTOS XML
Palmas
2003
MARCUS BARBOSA PINTO
UMA PROPOSTA PARA INTEGRAÇÃO DE ESQUEMAS
PARA DOCUMENTOS XML
“Monografia apresentada como
requisito parcial da disciplina de
Prática
de
Sistemas
de
Informação II, orientada pela
Profª. Deise de Brum Saccol”
Palmas
2003
MARCUS BARBOSA PINTO
UMA PROPOSTA PARA INTEGRAÇÃO DE ESQUEMAS
PARA DOCUMENTOS XML
“Monografia
apresentada
como
requisito parcial da disciplina de Prática
de Sistemas de Informação II, orientada
pela Profª. Deise de Brum Saccol”
Aprovado em Dezembro de 2003
BANCA EXAMINADORA
_____________________________________________
Profª. Deise de Brum Saccol
Centro Universitário Luterano de Palmas
_____________________________________________
Prof. Eduardo Kessler Piveta
Centro Universitário Luterano de Palmas
_____________________________________________
Profª. Parcilene Fernandes de Brito
Centro Universitário Luterano de Palmas
Palmas
2003
“O homem é capaz de partir e de chegar. Mas, o
que o define mesmo é a estrada. Mais do que ser de
chegada e de partida, o homem é um ser da
estrada. É um eterno caminhante. É um peregrino
destinado. É um estradeiro infatigável. Não resiste
ao apelo do horizonte misterioso que lhe pede
novos passos".
Arduini
DEDICATÓRIA
Para meus pais, Antônio Jorge Pinto e Elza Maria Barbosa Pinto, aos meus irmãos,
Maurício Barbosa Pinto e Murilo Barbosa Pinto e à minha querida sobrinha e afilhada
Wanessa Miranda Borges Pinto, simplesmente por fazerem parte da minha vida,
minimizando os obstáculos que freqüentemente dificultam minha caminhada e fazendo
valer a pena cada esforço. Obrigado por vocês existirem.
Para Adryelle Castro Coelho, Álvaro Nunes Prestes, Cristina Dornellas Filipakis, Danilo
de Abreu Noleto, Deise de Brum Saccol, Eduardo Kessler Piveta, Eduardo Leal, Fabiano
Fagundes, Helena Jorge Pinto, Liliam Deisy Ghizoni, Michael Schuenck dos Santos,
Parcilene Fernandes de Brito e Pollyane de Almeida Lustosa, pelo incentivo, paciência e
colaboração demonstrados ao longo desse ano.
AGRADECIMENTOS
Agradeço primeiramente a Deus por ter permitido que o meu caminho se cruzasse com o
caminho de tantas pessoas maravilhosas. Foram tantos os momentos de satisfação e alegria
que as dificuldades encontradas anteriormente parecem tão insignificantes. Obrigado, Pai,
por ter permitido esses encontros.
Agradeço a minha orientadora, Deise de Brum Saccol, pela flexibilidade, companheirismo,
confiança e atenção demonstrados durante todo esse tempo de convivência universitária.
Obrigado por tudo.
Agradeço aos amigos, Fabiano Fagundes e Parcilene Fernandes pelo apoio, credibilidade e
incentivo expressos desde o primórdio do NET (Núcleo Especial de Treinamento em
Informática) até os dias atuais.
Agradeço aos amigos, Danilo de Abreu Noleto, Michael Schuenk dos Santos e Pollyane
de Almeida Lustosa que compartilharam comigo os fracassos, as descobertas e as alegrias
proporcionados durante a fase de conclusão desse trabalho.
SUMÁRIO
1.
INTRODUÇÃO ......................................................................................................... 14
2.
REVISÃO DE LITERATURA................................................................................. 16
3.
4.
2.1
Dados Semi-estruturados .................................................................................... 16
2.2
Extensible Markup Language.............................................................................. 17
2.3
Document Type Definition................................................................................... 19
2.4
Data Guide .......................................................................................................... 21
2.5
XML Schema........................................................................................................ 25
2.6
Integração de esquemas XML ............................................................................. 27
2.7
Processo de integração de esquemas .................................................................. 29
2.8
Arquitetura JAXB ................................................................................................ 35
MATERIAIS E MÉTODOS..................................................................................... 37
3.1
Local e Período ................................................................................................... 37
3.2
Materiais.............................................................................................................. 37
3.3
Metodologia......................................................................................................... 37
RESULTADOS E DISCUSSÕES ............................................................................ 39
4.1
Proposta .............................................................................................................. 39
4.2
Estudo de caso ..................................................................................................... 42
4.3
Geração de DTD a partir de um documento XML.............................................. 45
4.4
Representação da DTD em formato XML ........................................................... 48
4.5
A ferramenta PINAJÉ.......................................................................................... 50
4.5.1
O processo de Integração da ferramenta...................................................... 50
4.5.2
Utilização..................................................................................................... 53
4.5.3
Arquivos de entrada..................................................................................... 55
4.5.4
Carregando documentos .............................................................................. 56
4.5.5
Instanciando objetos .................................................................................... 57
4.5.6
Identificando elementos e atributos na lista ................................................ 59
4.5.7
Classe ManipulaElemento ........................................................................... 61
4.5.7.1
Método nomeIgual(String nome) ............................................................ 61
4.5.7.2
Método nomeIgualTipoDiferente(String nome, String tipo)................... 61
4.5.7.3
Método integraNomeIgualTipoDiferente(Pai P) ..................................... 63
4.5.7.4
Método integraNomeIgualTipoIgual(Pai P)............................................ 64
4.5.7.5
Método insereElemento(int indice, Elemento E) .................................... 65
4.5.8
Classe ManipulaAtributo............................................................................. 66
4.5.8.1
Método nomeIgual(String elem,String nome)......................................... 66
4.5.8.2
Método nomeIgualTipoIgual(String elem,String nome, String Tipo)..... 67
4.5.8.3
Método integraNomeIgualTipoIgual(String elem,Atributo A) ............... 68
4.5.8.4
Método integraNomeIgualTipoDiferente(String elem,Atributo A) ........ 69
4.5.8.5
Método insereAtributo(Atributo A, String elemento) ............................. 70
5.
CONSIDERAÇÕES FINAIS.................................................................................... 72
6.
REFERÊNCIAS BIBLIOGRÁFICAS .................................................................... 74
LISTA DE FIGURAS
Figura 1 – Exemplo de um documento XML.................................................................. 18
Figura 2 – Exemplo de uma DTD .................................................................................... 21
Figura 3 – Objeto atômico ................................................................................................ 22
Figura 4 - Objeto complexo .............................................................................................. 23
Figura 5 – Exemplo de um Data Guide ........................................................................... 24
Figura 6 - Arquitetura para um sistema mediador (MELLO, 2002) ........................... 32
Figura 7 - Processo de integração de esquemas [MEL 2002] ........................................ 34
Figura 8 – Parte de um documento XML Schema ......................................................... 36
Figura 8 – Arquitetura de integração de esquemas ....................................................... 41
Figura 9 – Exemplo de declaração de atributo não permitida ...................................... 42
Figura 10 – Exemplo de declaração de elemento não permitida................................... 42
Figura 11 – Parte de um documento XML representando uma monografia .............. 44
Figura 12 - DTD gerada a partir de um documento XML ............................................ 48
Figura 13 - DTD representada por um documento XML.............................................. 50
Figura 14 – Exemplo da utilização da ferramenta PINAJÉ com dois arquivos .......... 55
Figura 15 – Carregando um documento xml .................................................................. 56
Figura 16 – Instanciando objetos ..................................................................................... 59
Figura 17 – Identificando elementos e atributos ............................................................ 60
Figura 18 – Parte do esquema utilizado para a criação das classes.............................. 60
Figura 19 – Exemplos de elementos com mesmo nome e tipos diferentes.................... 62
Figura 20 – Exemplos do código do método nomeIgualTipoDiferente ........................ 62
Figura 21 – Exemplos da integração de elementos......................................................... 63
Figura 22 – Exemplos do código do método nomeIgualTipoDiferente ........................ 64
Figura 23 – Exemplo de elementos diferentes com nomes e tipos iguais...................... 64
Figura 24 – Código do método integraNomeIgualTipoIgual ........................................ 64
Figura 25 – Exemplo de integração de elementos com tipos nulos ............................... 65
Figura 26 – Exemplo de integração de elementos mistos............................................... 65
Figura 27 – Inserindo novos elementos ........................................................................... 66
Figura 28 – Código do método nomeIgualTipoIgual da classe ManipulaAtributo ........ 67
Figura 29 – Exemplo de atributos com padrões de declarações diferentes.................. 68
Figura 30 – Parte do código do método integraNomeIgualTipoDiferente da classe
ManipulaAtributo ........................................................................................................ 69
Figura 31 – Parte do código do método insereAtributo(...) ........................................... 70
LISTA DE TABELAS
Tabela 1 – Tabela de marcações básicas (ANDERSON, 2001) ..................................... 19
Tabela 2 – Tipos de atributos (ANDERSON, 2001) ....................................................... 20
Tabela 3– Nomenclatura dos arquivos gerados pelas ferrementas............................... 54
Tabela 4 – Exemplo do processo de integração .............................................................. 57
RESUMO
Dados representados em XML podem ser considerados dados semi-estruturados. Dados
semi-estruturados possuem como características marcantes uma estrutura irregular,
dinâmica e heterogênea. Em função disto, a definição de um esquema único que valide
vários documentos pode não ser uma tarefa muito simples. Para ter acesso a esses dados,
comumente as aplicações baseiam-se nos esquemas que estão relacionados aos
documentos. Porém é possível que existam documentos sem nenhum esquema relacionado
ou ainda documentos referentes a um mesmo domínio com esquemas diferentes. A geração
de um esquema para os documentos que não o possuem e sua integração com os demais
esquemas existentes pode solucionar o problema mencionado. Neste sentido, este trabalho
ojetiva desenvolver uma ferramenta de integração de esquemas XML, visando a
automatização desse processo e diminuindo a necessidade de intervenção do usuário.
Palavras-chave: Esquemas para documentos XML, integração de esquemas, DTD
ABSTRACT
Data represented in XML can be considered semistructured data. Semistructured data have
some characteristics, as irregular, dynamic and heterogeneous structure. Because of that,
the definition of an unique schema that validates several documents can be a hard task. To
have access to these data, usually the applications base on the schemas that are in
accordance with the documents. However, it is possible the existence of documents
without schema or documents related to the same domain with different schemas. The
schema generation for documents that do not have it and its integration with the others can
solve the mentioned problem. In this sense, this work aims to develop an integration tool of
XML schemas, being aimed at the automatization of this process and decreasing of user
intervention.
Keywords: XML, structures for XML documents, DTD
14
1. INTRODUÇÃO
O crescente número de informações disponibilizadas eletronicamente através da
Web é consequência da popularização da internet e do aumento constante do número de
novos usuários. Uma característica comum entre a maior parte desses dados é a forma com
que são disponibilizados, não obedecendo a um padrão específico, principalmente por
possuírem estruturas irregulares, dinâmicas e bastante heterogêneas.
Inúmeras pesquisas estão sendo desenvolvidas na tentativa de propor um modelo
que possa dar uma certa estrutura a esses dados, possibilitando, desta forma, um melhor
acesso a esses dados (XML, 2003). A linguagem XML apresenta-se como uma alternativa
bastante satisfatória para representação destes dados.
Atualmente, a linguagem XML tem sido muito utilizada para representação e troca
de dados. Sua aceitação como mecanismo principal para representação e troca de dados
semi-estruturados, pode ser percebida no aumento do número de pesquisas relacionadas a
essa nova tecnologia. A tendência é a padronização dessa linguagem como principal
mecanismo para representação e intercâmbio dos dados que apresentam uma estrutura
irregular (MELO, 2001).
Assim como a comunidade científica está acreditando na utilização desse novo
recurso para representação e intercâmbio de dados semi-estruturados, a área comercial
também investe nessa nova tecnologia. O surgimento de bancos de dados específicos
(Tamino, Lore etc.) e a incorporação desse recurso à ferramentas bastante conhecidas
(Delphi, Oracle etc) é uma prova dessa aceitação.
Todavia, a irregularidade das estruturas dos documentos representados pela
linguagem XML dificulta o acesso automatizado a esses dados. Uma aplicação XML deve
ser flexível o suficiente para suportar as alternativas de representação que um determinado
dado pode possuir. Buscando englobar todos esses dados, é comum as ferramentas
utilizarem-se do esquema relacionado para alcançarem esse objetivo.
Um esquema XML deve prever quais elementos são encontrados nos documentos,
a ordem em que estes elementos estão dispostos, o tipo de dados do conteúdo de cada
15
elemento etc. Essas informações disponibilizadas pelo esquema podem ser utilizadas para
diversos fins. Entretanto, devido a grande heterogeneidade que envolvem os documentos
XML, é possível que existam esquemas diferentes referentes a um mesmo domínio de
aplicação. A integração de esquemas XML referentes a um domínio específico pode ser
uma alternativa satisfatória para solucionar o problema mencionado.
O objetivo dessa monografia é disponibilizar uma alternativa para a integração de
esquemas XML. Desta forma, torna-se necessário o conhecimento de alguns mecanismos
que funcionam como esquemas para dados representados através dessa linguagem e o
conhecimento de algumas regras encontradas na literatura para a integração de esquemas.
A seção 2, deste trabalho, apresenta um levantamento teórico sobre algumas tecnologias
relacionadas a linguagem XML. O capítulo 3 especifica os materiais utilizados para o
desenvolvimento do trabalho. Os resultados e discussões, presentes no capítulo 4,
apresentam as características principais do processo de integração utilizado nesse trabalho.
O capítulo 5 é referente às considerações finais.
16
2. REVISÃO DE LITERATURA
Nesta seção são discutidos alguns pontos relevantes para o trabalho. As
considerações, observações e as conclusões alcançadas foram baseadas nos estudos e
pesquisas realizadas. Os temas abordados nesta seção estão relacionados à tecnologia
XML.
2.1
Dados Semi-estruturados
Dados armazenados em SGBDR’s (Sistemas Gerenciadores de Banco de Dados
Relacionais) são considerados dados estruturados. O fator de maior relevância para a
afirmação acima está relacionado à sua estrutura, a qual é definida antes do conhecimento
dos dados (definição de esquema a priori). Portanto, espera-se que os dados sigam um
mesmo padrão, diferentemente dos dados semi-estruturados que podem não seguir.
Os dados semi-estruturados possuem como características principais uma estrutura
irregular, dinâmica e bastante heterogênea. Um exemplo típico destes tipos de dados pode
ser encontrado nos dados da Web. A grande maioria dos dados existentes na internet não
estão armazenados de forma estruturada e não seguem um padrão único, sendo
considerados portanto dados semi-estruturados.
A busca por mecanismos que auxiliam o entendimento tanto por aplicações quanto
pelo homem está tornando-se freqüente na área científica. A linguagem XML vem se
destacando como um mecanismo de fundamental importância e tornando-se a cada dia um
padrão para manipulação de dados semi-estruturados (DAUM, 2002).
17
2.2
Extensible Markup Language
XML é uma sigla que representa eXtensible Markup Language - linguagem de
marcação extensível (XML, 2003). Diferentemente da maioria das linguagens de
marcação, inclusive a própria HTML (HyperText Markup Language – linguagem de
marcação de hipertexto), XML não apresenta um conjunto limitado de tags a serem
utilizadas. Sua característica flexível permite a seus usuários a definição de suas próprias
tags e a criação de suas próprias linguagens de marcação. Para a definição de um conjunto
de tags, XML oferece uma estrutura padrão que possibilita ao usuário a criação de sua
própria estrutura ou a utilização de outras estruturas já definidas. Uma considerável
vantagem da utilização da XML para criação de novas linguagens é o fato que todas as
linguagens baseadas na XML compartilham uma sintaxe básica comum (RDF, OWL, XML
Schema, MML). A figura 1 representa um documento XML.
1
<?xml version='1.0'?>
2
<lista>
3
<responsavel>
4
<nome>Kenia</nome>
5
<nome>Rosmarina</nome>
6
<nome>Samira</nome>
7
<nome>Pollyane</nome>
8
<nome>Alina</nome>
9
</responsavel>
10
<local>
11
<lugar>Quarteto</lugar>
12
<lugar>Caculinha</lugar>
13
</local>
14
<data dia="12" mes="8" ano="2002"/>
15
<setor>
16
<nomes>Frios</nomes>
17
<produto>
18
<nomep>Queijo</nomep>
19
<quant>2</quant>
20
<unit>kg</unit>
21
<precoant>9,00</precoant>
22
<precoatual>10,00</precoatual>
23
</produto>
18
24
<produto>
25
<nomep>Presunto</nomep>
26
<quant>2</quant>
27
<unit>kg</unit>
28
<precoant>10,00</precoant>
29
<precoatual>12,00</precoatual>
30
31
32
</produto>
</setor>
</lista>
Figura 1 – Exemplo de um documento XML
A XML possui sua origem na SGML (Standard Generalized Markup Language),
um padrão especificado pela ISO 8879 em 1986, mais poderoso para criação de linguagens
que a própria XML (ANDERSON, 2001). Um fator de relevância que levou
desenvolvedores a pesquisarem e criarem novas linguagens mais leves, simples e que
fossem utilizadas na Web foi a complexidade que envolve a utilização da SGML.
Entretanto, SGML ainda tem sido bastante utilizada por grandes empresas que buscam
desenvolver alternativas satisfatórias que possam auxiliar na realização de diferentes
funções (McGRATH, 1999).
XML foi lançada oficialmente em 1996 pelo W3C (World Wide Web Consortium),
organização responsável pela regulamentação dos padrões da internet, possuindo como
característica marcante a combinação da capacidade e flexibilidade da SGML com a
enorme aceitação da HTML (ANDERSON, 2001).
A XML vem tornando-se o principal padrão para representação de dados que não
apresentam uma estrutura bem definida. A própria especificação da linguagem XML
apresentada pelo W3C juntamente com a crescente necessidade da definição de uma
estrutura para documentos semi-estruturados permitem a realização dessa afirmação.
XML pode ser utilizada para representação e troca de documentos e informações
entre sistemas e aplicações diferentes, sendo um elo comum de entendimento entre ambos.
Além disso, permite o armazenamento estruturado dos dados em um formato de texto
próprio com extensão .xml. Uma característica expressiva dessa linguagem é a adição de
uma certa estrutura a documentos semi-estruturados.
19
2.3
Document Type Definition
Normalmente, um documento XML está ligado a uma linguagem de especificação,
definição ou marcação. DTD é uma linguagem utilizada para definição dos tipos de dados
a serem usados no documento relacionado. Comumente, atribui-se a uma DTD a
responsabilidade do uso de uma linguagem oficial para delimitar a estrutura e os possíveis
valores nos documentos XML. Basicamente uma DTD define um vocabulário comum que
documentos .xml referenciados devem obedecer (ANDERSON, 2001).
As regras a serem especificadas em uma DTD devem iniciar sempre com os
símbolos <! (menor e exclamação) seguido de um marcador básico obrigatoriamente
escrito com letra maiúscula e terminado com um sinal de maior. Todas as definições que
fogem desse padrão não fazem parte da especificação de DTD. A tabela abaixo apresenta
os quatro tipos possíveis de declarações de marcação básicas usadas na DTD:
Tabela 1 – Tabela de marcações básicas (ANDERSON, 2001)
Marcadores básicos
Significado
ELEMENT
Declaração de um tipo de elemento XML
ATTLIST
Declaração dos atributos que podem ser designados a um tipo
de
elemento
específico
e
os
valores
permissíveis
destes
atributos
ENTITY
NOTATION
Declaração de conteúdo reutilizável
Declarações de formato para o conteúdo externo que não deve
ser analisado em termos de sintaxe (dados binários, por
exemplo), e a aplicação externa que lida com o conteúdo
De acordo com (ANDERSON, 2001), o conteúdo de um elemento DTD pode ser
dividido em cinco grupos:
•
Dados de caractere: Todo elemento declarado como sendo do tipo #PCDATA deverá
ter em seu conteúdo somente caracteres que devem obedecer as regras de nomes da
especificação XML, como não iniciar com alguns caracteres especiais.
•
Conteúdo vazio: O elemento declarado como do tipo
EMPTY
não pode ter nenhum
texto ou elemento em seu conteúdo. Somente atributos são permitidos a esse tipo de
elemento.
20
•
Conteúdo misto: O elemento do tipo misto é formado por uma mistura de dados de
caractere e por elementos. Toda declaração de conteúdo misto deve ser iniciada
com o
#PCDATA
e a cardinalidade do conjunto deve ser “zero ou mais”,
obrigatoriamente.
•
Conteúdo indefinido: é possível definir um tipo de elemento que não tenha um tipo
básico definido, podendo ser formado por uma combinação de elementos ou texto.
Um elemento declarado como do tipo ANY possui essas características.
•
Conteúdo de elementos: Elementos que não possuem
textos nem atributos,
possuindo apenas elementos filhos, enquadram-se nesse grupo.
A DTD disponibiliza uma forma relativamente simples de definição de
cardinalidade na declaração de elementos.
? - elemento opcional, podendo aparecer no máximo uma vez.
+ - elemento deve aparecer pelo menos uma vez.
* - elemento pode aparecer zero ou mais vezes.
Além de elementos, uma DTD também pode ser composta por atributos,
normalmente utilizados para complementar e modificar elementos. Os atributos são
considerados uma das propriedades mais ricas de um documento XML quando este é
definido por uma DTD, oferecendo meios de associar propriedades simples a elementos
(ANDERSON, 2001). Toda definição de um atributo em uma DTD consiste na utilização
da tag ATTLIST seguida do nome do elemento que receberá o atributo, do nome do atributo,
do tipo de atributo e de uma das declarações padrões de atributos. De acordo com
(ANDERSON, 2001) os tipos de atributos são:
Tabela 2 – Tipos de atributos (ANDERSON, 2001)
Tipo de atributo
CDATA
ID
IDREF
Significado
Dados de caractere (string)
Nome único em um dado documento
Referência a alguns elementos que tenham um atributo ID com o
mesmo valor que o atributo IDREF
IDREFS
Série de IDREFs delimitados por espaço em branco
ENTITY
Nome de um entidade externa predefinida
ENTITIES
Série de nomes ENTITY delimitados por espaço em branco
21
NMTOKEN
Um nome
NMTOKENS
Uma série de NTOKENS delimitados por espaço em branco
NOTATION
Aceita um ou uma série de nomes indicando tipos de anotação
declarados no DTD
Valor enumerado
Aceita uma de uma série de valores definidos pelo usuário
A figura 2 apresentada abaixo representa uma das possiveis DTDs que podem
validar o documento XML referente à figura 1.
1
<!ELEMENT lista (responsavel, local, data,setor)>
2
<!ELEMENT responsavel (nome+)>
3
<!ELEMENT nome (#PCDATA)>
4
<!ELEMENT local (lugar+)>
5
<!ELEMENT lugar (#PCDATA)>
6
<!ELEMENT data EMPTY>
7
<!ATTLIST data dia CDATA #REQUIRED
8
mes (1|2|3|4|5|6|7|8|9|10|11|12) "1" ano CDATA #REQUIRED>
9
<!ELEMENT setor (nomes+,produto+)>
10
<!ELEMENT nomes (#PCDATA)>
11
<!ELEMENT produto (nomep,quant, unit, precoant, precoatual)>
12
<!ELEMENT quant (#PCDATA)>
13
<!ELEMENT unit (#PCDATA)>
14
<!ELEMENT nomep (#PCDATA)>
15
<!ELEMENT precoant (#PCDATA)>
16
<!ELEMENT precoatual (#PCDATA)>
Figura 2 – Exemplo de uma DTD
2.4
Data Guide
O Data Guide é uma estrutura de índices para banco de dados semi-estruturados
gerados dinamicamente a partir de um ou mais documentos XML. Pode ser considerado
um esquema dinâmico gerado a partir da fonte de dados XML, sendo bastante útil para
navegação, armazenamento, formulação e otimização de consultas em banco de dados
semi-estruturados (GOLDMAN, 2000).
Essa estrutura de índices foi desenvolvida pela Universidade Stanford, nos Estados
Unidos, para definição de esquemas para banco de dados semi-estruturados, mais
22
especificamente o Lore (Lightweight Object Repository). Ambos estão relacionados ao
projeto de pesquisa LORE (LORE 2003).
Uma característica dessa estrutura de índices é sua relação com a definição de
OEM (Object Exchange Model), modelo de dados orientado a grafo. Todo Data Guide é
baseado nessa estrutura de grafos proposta por Papakonstantinou em 1995.
O modelo de grafos OEM é baseado na idéia de que cada objeto existente na base
de dados possui um identificador único, um OID (identificador único do objeto), bastante
utilizado na especificação dos bancos de dados orientados a objetos e pós-relacional
(bancos de dados objeto-relacional). O modelo de grafos OEM possui uma representação
bastante simples e muito flexível para a representação de dados que não apresentam uma
estrutura bem definida. Seguindo uma estrutura hierárquica em forma de árvore, um
modelo OEM deve representar todas as ocorrências dos dados semi-estruturados existentes
no documento.
Apenas dois tipos de objetos são encontrados na definição de OEM (MELO, 2000):
objetos atômicos e objetos complexos. Os objetos atômicos podem ser dos tipos já
definidos e conhecidos como integer, real, string, double etc. Todo objeto atômico é
representado como nó folha em uma representação gráfica do OEM.
Os objetos
complexos normalmente são formados por um conjunto de outros objetos. Na verdade,
cada objeto complexo possui um tipo que faz referência a outros objetos do documento,
representando objetos que apontam para outros objetos.
Um objeto OEM é formado por (PAPAKONSTANTINOU, 1995):
•
Rótulo – é uma string de caracteres de tamanho variável que descreve a
representação do objeto.
•
Tipo – define o tipo do objeto. Cada tipo pode ser atômico ou complexo, em que o
último pode ser formado por um conjunto ou lista de tipos.
•
Valor – é um valor de tamanho variável para o objeto.
•
OID (identificador do objeto) – é um identificador único de tamanho variável do
objeto. Um OID pode ser nulo ou ainda omitido da representação conceitual, uma
vez que seus valores devem ser tratados internamente pelo banco de dados.
Objetos OEM podem ser representados conforme as figuras abaixo:
1
<RG, integer, 395782>
Figura 3 – Objeto atômico
23
1
2
<Funcionario, set,{Tnome,Tendereco,Ttelefone,Trg,TestadoCivil}>
Tnome is<nome, string, “Marcus Barbosa Pinto”>
5
Tendereco is<endereco,string,“QD 403 Sul QI 02 Lote 09”>
6
Ttelefone is <telefone, string, “(63)225-2090”>
7
Trg is <rg, integer, 395782 >
8
TestadoCivil<estadoCivil, string, “solteiro”>
Figura 4 - Objeto complexo
O primeiro exemplo representa um objeto atômico
RG
que representa um
determinado número de registro geral. O segundo exemplo representa um objeto complexo
Funcionario
que faz referência a outros objetos, podendo ser outros objetos complexos ou
outros objetos atômicos.
Com o surgimento da linguagem XML, as pesquisas relacionadas à utilização de
OEM para representar dados semi-estruturados foram gradativamente substituídas. O
banco de dados LORE também substituiu sua forma de representação de dados que
apresentam uma estrutura irregular, antes usando grafos OEM, por essa nova linguagem.
Baseado nessa estrutura de grafos, um Data Guide é dinâmico e pode sofrer
alterações à medida em que a estrutura dos documentos a ele relacionados estiverem sendo
atualizados. Com base em um número finito de arquivos XML dados como entrada, o Lore
gera os Data Guides. Essa estrutura possui a finalidade de melhorar o desempenho do
banco de dados, uma vez que tem a responsabilidade de descrever a existência de
determinados elementos, normalmente evitando que buscas por elementos inexistentes
sejam realizadas.
Outra característica dessa estrutura é sua não limitação do número de instâncias de
um determinado elemento que compõe o documento relacionado. O máximo que essa
estrutura informa é a existência ou não de um determinado elemento. Cabe à aplicação que
o estiver utilizando realizar a verificação de mais de uma instância do elemento.
Resumidamente, um Data Guide não informa o número de filhos que um determinado
elemento possui, ele apenas informa a existência deles.
24
Figura 5 – Exemplo de um Data Guide
Dependendo do domínio que está sendo utilizado, mais precisamente do tamanho
do Data Guide gerado, a representação gráfica dessa estrutura pode ajudar os usuários na
formulação de consultas válidas, aumentando o desempenho da aplicação que o está
utilizando.
Um Data Guide deve ser um conjunto de índices conciso, preciso e convenientes da
estrutura de uma base de dados (GOLDMAN, 2000). A consistência é assegurada quando
esta estrutura representa cada caminho existente na base de dados uma única vez,
independente da quantidade de vezes que esse dado aparece no documento. A precisão e a
exatidão são asseguradas quando o Data Guide não gera nenhum caminho que não exista
na base de dados. Somente caminhos válidos estarão representados na estrutura gerada. A
conveniência é assegurada quando um Data Guide pode ser entendido e trabalhado como
um objeto OEM, onde as técnicas de armazenamento e consulta anteriormente utilizadas
podem ser reaproveitadas.
É possível que para uma mesma base de dados sejam gerados vários Data Guides.
Assim sendo, pode ocorrer a necessidade de integração de Data Guides referentes a um
mesmo domínio de atuação; no entanto, o que normalmente ocorre é uma atualização em
um determinado Data Guide com base nas alterações que ocorreram nas fontes. Porém,
25
para a realização de alterações nos Data Guides o ideal seria que eles fossem considerados
Data Guides fortes, flexíveis e que representam todos os caminhos presentes na base de
dados, pois sua escolha pode influenciar no resultado final do processamento de
determinadas consultas ou ainda dificultar enormemente o processo de otimização das
mesmas. Um estudo detalhado sobre a importância dos Data Guides fortes pode ser
encontrada em (GOLDMAN, 2000).
2.5
XML Schema
A XML Schema foi desenvolvida pelo W3C com o objetivo principal de superar as
eventuais deficiências encontradas na DTD para definição de esquemas para documentos
XML. Lançada publicamente como “working draft” no ano de 1999 no site da W3C, a
XML Schema foi definitivamente recomendada em maio de 2001 como linguagem oficial
de definição de esquemas para documentos XML (DAUM, 2002).
Existem dois tipos básicos de elementos encontrados na linguagem XML Schema:
elementos simples e elementos complexos. Um elemento simples pode ser definido com a
utilização do elemento
element,
seguido
dos atributos
name
e
type,
nome e tipo do
elemento, respectivamente. Um elemento simples também pode ser definido com a
utilização do elemento
simpleType,
normalmente utilizado quando se deseja impor alguma
restrição ao elemento.
Ao contrário dos elementos simples, os elementos complexos podem conter outros
elementos e atributos. Existem duas formas distintas para a declaração de elementos
complexos: uma para a declaração de novos elementos e outra que permite a utilização de
elementos e atributos declarados pelo próprio autor do esquema. Para a declaração de
novos elementos complexos é necessário a utilização do elemento complexType juntamente
com a definição do nome e o conteúdo.
A XML Schema permite um certo reaproveitamento de código. É possível a
definição
de
tipos
de
elementos
reutilizando
tipos
declarados
anteriormente.
Conseqüentemente, todos os elementos que forem declarados como um tipo pré-definido
devem possuir todos os elementos e todos os atributos que constituem o elemento utilizado
como tipo na declaração. A ordem dos elementos deve ser obedecida.
26
A linguagem XML Schema disponibiliza dois atributos para a definição de
cardinalidade na declaração de elementos. O atributo minOccurs é responsável por indicar o
número mínimo de vezes que um elemento deve aparecer. Quando esse atributo é omitido
da
declaração é assumido que a quantidade mínima de vezes que o elemento pode
aparecer é 1. O atributo responsável pela indicação do número máximo de vezes que um
determinado elemento pode aparecer é o
maxOccurs.
Quando não se tem definido a
quantidade máxima de vezes em que um elemento deve aparecer o valor unbounded deve
ser atribuído ao atributo maxOccurs. Se esse atributo for omitido da declaração, entende-se
que esse elemento deve aparecer no máximo uma vez no documento.
A XML Schema define três delimitadores de grupos para definição da ordem em que
os elementos devem aparecer dentro do documento XML válidos pelo esquema. O
delimitador sequence informa que os subelementos devem aparecer no documento XML na
mesma ordem em que se apresentam no documento XML Schema. O delimitador
choice
informa que apenas um dos subelementos declarados no esquema deve aparecer no
documento. Por fim tem-se o delimitador
all
que informa que todos os elementos
declarados no esquema podem aparecer uma ou nenhuma vez no documento, podendo
aparecer em qualquer ordem.
Os atributos dentro das definições da linguagem XML Schema são de fundamental
importância para a consolidação dessa linguagem como padrão para a definição de
esquemas para documentos XML. São eles os responsáveis por grande parte do controle
exercido sobre os dados que compõem os documentos XML válidos pelo esquema.
Basicamente, os atributos são declarados com a utilização do elemento
seguido do atributo
name
e
type,
attribute
e igualmente aos elementos simples, eles não podem
conter outros elementos ou outros atributos. Outras informações podem ser adicionadas na
declaração de atributos com utilização do use (utilização), fixed (valor fixo) e default (valor
padrão). O tipo
simpleType
também é utilizado como uma forma de aumentar as restrições
existentes no atributo a ser declarado. Toda declaração de atributo deve estar relacionada à
declaração de um elemento complexo.
Apesar da evolução alcançada com a utilização da linguagem XML Schema para
definição de esquemas para documentos XML, ainda existem muitos obstáculos que
devem ser superados. Alguns desses obstáculos estão relacionados ao fato que a XML
Schema é relativamente complicada para entender, sendo normalmente um arquivo de
texto bastante extenso. Pelo fato do seu tamanho ser relativamente grande, a sua utilização
27
no desenvolvimento de aplicações cliente-servidor pode trazer problemas de validação,
uma vez que o cliente pode realizar alguma operação antes do carregamento total do
esquema de validação (DAUM, 2002). O esquema de validação no caso anterior seria o
próprio documento XML Schema.
Outra deficiência percebida na utilização da XML Schema está relacionada com as
definições de restrições nos elementos e nos atributos. Apesar dos enormes avanços se
comparados à DTD, a XML Schema somente impõe restrições básicas, como tipo de dados
e relações com exclusividade. As restrições de correlação entre atributos de um mesmo
elemento praticamente não existem. Não é possível definir, por exemplo, que um
determinado atributo seja preenchido com determinado valor se um outro atributo receber
um valor 0.
2.6
Integração de esquemas XML
A necessidade cada vez maior de utilização de dados que não apresentam uma
estrutura regular pode ser encontrada na maioria das áreas da informática. Dentre elas, uma
em especial há muito já reconheceu essa necessidade. Inicialmente uma preocupação da
comunidade de Banco de Dados era de encontrar uma estrutura rígida na qual os dados,
ainda em seu formato bruto, pudessem ser encaixados em um esquema pré-definido. O
enquadramento desses dados em uma estrutura fixa trouxe consideráveis benefícios.
Partindo de um princípio simples no qual os dados seriam armazenados de acordo com um
determinado esquema que aparentemente permaneceria invariável, onde todas as
informações contidas seguiriam obrigatoriamente essa mesma estrutura, melhorias
puderam mais facilmente ser incrementadas.
Com a organização dos dados e a aparente restrição imposta pelo esquema,
aplicações puderam gerenciar mais facilmente os possíveis dados armazenados. SGBD’s
foram agregando com o tempo novas tecnologias que aumentavam ainda mais sua
capacidade de gerenciamento dos dados armazenados. Como exemplo dessa evolução,
pode-se citar os SGBDR’s que sofreram evoluções consideráveis ao longo de sua
existência. Questões relacionadas principalmente à capacidade de armazenamento,
segurança das informações contidas no banco e desempenho apresentaram um alto grau de
evolução nos últimos anos.
28
Para aplicações que se beneficiam dos esquemas dos documentos XML, o ideal
seria que os documentos estivessem de acordo um único esquema específico. Normalmente
isso não ocorre. É comum a existência de documentos XML relacionado a um esquema
próprio ou ainda sem nenhuma relação. Para o primeiro caso, a integração de esquemas
relacionados a um domínio específico pode ser uma saída satisfatória.
O tema principal desse trabalho está relacionado à integração de esquemas para
documentos XML. A utilização de técnicas relacionadas à tecnologia XML é justificada,
uma vez que sua aceitação é crescente tanto em meios acadêmicos quanto em meios
comerciais.
A integração de esquemas proposta neste trabalho tem com base as seguintes
premissas (ANDERSON, 2001):
•
Um esquema XML é todo o documento que represente a estrutura de um ou
mais documentos semi-estruturados;
•
Esquemas podem ser considerados um conjunto de regras que descrevem o
conteúdo dos documentos relacionados;
•
Restrições podem ser especificadas dentro de um esquema;
•
Relacionamentos entre elementos podem ser encontrados em esquemas;
•
Um esquema defini um conjunto de documentos válidos de acordo com suas
regras;
•
Resumidamente, um esquema possui na maioria das vezes dois conceitos
básicos: restringir e explicar;
•
DTD, XML Schema e Data Guides são considerados esquemas para
documentos XML;
•
A DTD é a estrutura escolhida para integração de esquemas.
A realização da integração de esquemas para documentos XML representados
através de uma DTD, parte do princípio que dado um conjunto de esquemas acerca de um
mesmo domínio como entrada, produza como saída um esquema único que explique ou
restrinja todos os documentos antes definidos pelos esquemas de entrada. Para suportar as
diversidades que podem ser encontradas nos documentos relacionados, é possível que as
restrições ou explicações sejam impostas com menos rigor no esquema final gerado com
base nos arquivos de entrada.
29
Esquemas para documentos XML são normalmente utilizados por aplicações que
manipulam os dados contidos nos documentos XML. Com base nestes esquemas, essas
aplicações tentam beneficiar-se das informações disponibilizadas pelo esquema para
realizarem tarefas específicas, normalmente relacionadas à manipulação dos dados
contidos nos documentos XML relacionados. Como exemplo destas aplicações, pode-se
citar os Sistemas Gerenciadores de Banco de Dados Semi-estruturados Lore (McHUGH,
1997) (LORE, 2003) e Tamino (SOFTWARE AG, 2003).
2.7
Processo de integração de esquemas
O gerenciamento adequado dos dados que apresentam um elevado grau de
heterogeneidade é uma área de pesquisa da comunidade de banco de dados há vários anos.
As pesquisas realizadas nessa área estão relacionadas à necessidade crescente das
organizações de compartilharem as mais diversas informações. Muitas vezes, estas
informações estão dispostas em locais, plataformas e gerenciadas por aplicações diferentes.
As evoluções ocorridas na área de redes de computadores, principalmente com a
padronização estabelecida pelos órgãos competentes (ISO, 2003), também contribuíram
para o aumento das pesquisas relacionadas ao gerenciamento de dados heterogêneos.
Segundo
(WIEDERHOLD,
1993),
podem
ocorrer
diversos
tipos
de
heterogeneidade entre banco de dados, dentre os quais, a heterogeneidade de hardware (a
existência de diferentes sistemas operacionais e principalmente protocolos de acesso), a
heterogeneidade de software (diferentes sistemas gerenciadores de banco de dados e com
diferentes modelos de dados) e a utilização de esquemas diferentes para o banco
(interpretações podem ser comprometidas visto que um mesmo dado pode está
representado de formas diferentes).
Independente da arquitetura que será utilizada por qualquer sistema de
gerenciamento de dados heterogêneos, existe a necessidade da criação de um esquema
global para a fonte de dados. Normalmente é possível que a geração desse esquema global
esteja relacionado à integração dos esquemas já existentes para as diversas bases de dados.
Integração de esquemas pode ser definida como um processo de geração de um esquema
integrado e único com base em um conjunto finito de esquemas de entrada, resolvendo as
diversidades semânticas e estruturais existentes nos esquemas de entrada (BATINI, 1986).
30
O processo de integração de esquemas é bem complexo, pois normalmente a
semântica dos esquemas não está formalmente documentada. Por isso, grande parte das
ferramentas para integração de esquemas são semi-automáticas: em sua maioria, elas
sugerem conceitos que aparentemente podem ser integrados, cabendo ao usuário aceitar,
ignorar ou ainda realizar modificações na integração sugerida pela ferramenta (RAHM
,2001).
A integração de esquemas pode ser dividida nas seguintes etapas (BATINI, 1986):
•
Pré- integração: existe a necessidade de analise dos esquemas existentes para
escolher a melhor forma de integração a ser utilizada. Pode ser necessário decidir a
ordem em que a integração deverá ocorrer e se essa integração é total ou parcial;
•
Comparação de Esquemas: talvez seja necessário identificar possíveis conflitos que
podem ocorrer no processo de integração. As correspondências e as diferenças de
conceitos existentes nos esquemas de entrada, principalmente ligadas a atributos,
restrições de integridade e relacionamentos, devem ser especificadas;
•
Unificação: eliminação de conflitos entre conceitos presentes nos esquemas. Para a
realização dessa unificação, os seguintes critérios devem ser seguidos:
o Completude e corretude: obrigatoriamente o esquema gerado a partir dos
esquemas de entrada deve conter todos os conceitos presentes nos esquemas
iniciais;
o Minimalidade: não poderá ocorrer a repetição de conceitos dentro do
esquema global gerado (um conceito que foi representado em mais de um
esquema de entrada só poderá ser representado uma única vez no esquema
global);
o Compreensão: preferencialmente o esquema geral gerado com base nos
esquemas de entrada deve ser de fácil compreensão para projetistas e
usuários. A preferência por representações claras torna-se evidente.
Normalmente informações de mapeamento entre conceitos no esquema final
e esquemas de entradas são gerados nessa etapa do processo e mantidos em local
específico (dicionário de sinônimos, por exemplo).
•
Reestruturação: atividades como inclusão de relações inter-esquemas e a
simplificação do esquema integrado, como a eliminação de relacionamentos
31
repetidos, podem ser necessárias. A primeira atividade também pode ocorrer na
etapa anterior.
Um processo de integração de esquemas que se baseia na entrada de uma
quantidade finita de esquemas e gera como saída um esquema global resultante da união
dos conceitos existentes em cada esquema, é conhecido como um processo bottom-up.
Quando esse processo ocorre de forma inversa, ou seja, a partir de um esquema único são
gerados vários esquemas com menor amplitude, é conhecido como processo top-down
(SHETH, 1990). O processo utilizado nesse trabalho pode ser encaixado no processo
bottom-up.
Para a integração de fontes de dados XML, (MELLO, 2002) propõe um processo
chamado BinXS, sigla que representa Bottom-up Integration of XML Schemata. Esse
processo é uma parte integrante da camada de mediação para a realização de acessos às
várias fontes XML que podem existir. Dois propósitos são encontrados nessa camada: a
possibilidade de realização de consultas com base no esquema global e a integração
semântica dos esquemas.
A figura 6 representa a arquitetura de um sistema que utiliza mediadores. (MELLO,
2002) divide a arquitetura representada pela figura 6 em wrapping, mediação e
apresentação:
•
A camada de wrapping: é a camada mais baixa do sistema, sendo composta por um
conjunto de wrappers, onde cada um é responsável pelo acesso aos dados de um ou
mais documentos XML que estejam definidos de acordo com uma determinada
DTD. Em caso da inexistência de uma estrutura que defina um documento XML,
no caso específico uma DTD, cabe ao wapper providenciar sua geração através de
um exame dos dados existentes no documento analisado. Essa camada também
realiza consultas sob sua responsabilidade. Para tanto, recebe informações da
camada de mediação referentes às consultas a serem realizadas e retorna para a
mesma camada o resultado da requisição solicitada em formato XML. Cada
consulta realizada dever estar de acordo com a DTD de cada wapper. Por não fazer
parte do foco principal do trabalho, detalhes dessa camada não foram apresentadas
na proposta.
32
Figura 6 - Arquitetura para um sistema mediador (MELLO, 2002)
•
A camada de mediação: é a camada mediadora da arquitetura. O mediador
encontrado nessa camada é responsável pela realização do processo de integração
semântica de esquemas e consulta a fontes XML. Na proposta foi definido que o
sistema atuará sobre um único domínio de aplicação, necessitando de um único
mediador.
•
A camada de apresentação: é a camada superior da arquitetura. Nessa camada
encontra-se uma interface utilizada pelos usuários e pelas aplicações para a
realização de consultas nas fontes de dados XML. Uma visão do esquema global é
disponibilizada nessa interface para auxílio na formulação de consultas que
posteriormente serão traduzidas para uma linguagem de consulta a dados XML e
enviadas para a camada de mediação. A interface de consulta também pode ser
responsável pela conversão das informações recebidas pela camada de mediação,
33
antes que sejam apresentadas ao usuário. Essa conversão pode ser entendida como,
por exemplo, a agregação de uma tabela aos dados XML recebidos ou ainda a
inclusão de outras formas de apresentação com gráficos, textos etc.
É importante ressaltar que o processo de integração proposto no BinXS é semiautomático e bottom-up. Essa característica semi-automática exige a necessidade de um
usuário especialista que tenha a função de validar as possíveis integrações sugeridas na
proposta (MELLO, 2002).
O processo de integração proposto por (MELLO, 2002) no BInXS apresenta duas
etapas bem definidas, como representadas na figura 7:
•
A etapa de conversão de DTD: Nessa etapa, cada DTD associada aos documentos
referentes à fonte XML é convertida em um esquema conceitual. Essa conversão
possibilita uma abstração maior da DTD que leva em conta a semântica de seus
dados, minimizando as complicações que podem ocorrer na etapa posterior à
integração. Possivelmente haverá a necessidade da intervenção do usuário para
determinar a intenção de um determinado dado. Além da DTD, os documentos
XML referentes são também analisados para auxílio em alguns pontos dessa
conversão, como por exemplo, a definição de relacionamentos existentes na DTD.
Todas as informações referentes ao mapeamento realizado são armazenadas em um
local específico.
34
Figura 7 - Processo de integração de esquemas [MEL 2002]
•
A etapa de integração: essa etapa é responsável pela integração dos esquemas
gerados. Como resultado dessa integração é gerado um esquema global para os
esquemas de entrada. Os passos seguidos nessa etapa seguem basicamente a mesma
ordem sugerida pelo processo de integração bottom-up tradicional, sendo a
intervenção do usuário novamente requerida para confirmar ações que ocorram nas
fases de unificação e comparação de esquemas. A Ferramenta ARTEMIS
(CASTANO, 2001) é utilizada nesse processo.
A proposta BInXS sugerida por (MELLO, 2002) exige necessariamente a
existência de um usuário especialista do domínio que confirme, anule ou modifique os
esquemas que podem ser sugeridos em todo o processo. A principal vantagem dessa
técnica está relacionada a uma considerável diminuição dos conflitos que podem ocorrer
em um processo de integração de esquemas. Em contrapartida, um processo que às vezes é
35
manual, pode torna-se exaustivo e bastante demorado, dependendo da integração que está
sendo realizada.
Para o processo de integração de esquemas DTD’s, o trabalho utilizará a arquitetura
JAXB para acessar os dados referentes a cada documento, visto que cada documento será
convertido para um formato XML. Maiores informações sobre a conversão de DTD’s para
XML podem ser encontradas na seção 4.4 desse trabalho.
2.8
Arquitetura JAXB
A arquitetura JAXB é uma tecnologia Java que permite criar uma série de classes
Java para manipular documentos XML de acordo com um XML Schema. Essa tecnologia
permite a representação de cada documento XML, mapeando-o para uma série de objetos
java. Partes específicas do documento referenciado são representadas por objetos das
classes geradas pela arquitetura (ARMSTRONG, 2003).
Um documento XML Schema utiliza a sintaxe da linguagem XML para descrever
os possíveis relacionamentos existentes entre os elementos, atributos e entidades de cada
documento XML relacionado. A finalidade de um documento XML Schema é definir uma
classe para documentos XML que devem obedecer a uma série de regras específicas
relacionadas principalmente à sua estrutura (W3C CONSORTIUM, 2003). A figura abaixo
representa parte do documento XML Schema utilizado para a geração das classes java.
1
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2
<xsd:element name="raiz" type="Raiz2"/>
3
<xsd:complexType name="Raiz2">
4
<xsd:choice maxOccurs="unbounded">
5
<xsd:element name="elemento" type="Elemento"/>
6
<xsd:element name="atributos" type="Atributos" minOccurs="0"/>
7
</xsd:choice>
8
</xsd:complexType>
9
<xsd:complexType name="Elemento">
10
11
12
<xsd:sequence>
<xsd:element name="pai" type="Pai"/>
</xsd:sequence>
13
</xsd:complexType>
14
<xsd:complexType name="Pai">
36
15
<xsd:sequence>
16
<xsd:choice minOccurs="0" maxOccurs="unbounded">
17
<xsd:element name="filho" type="Filho"/>
18
<xsd:element name="delimitador" type="xsd:string"/>
19
</xsd:choice>
20
<xsd:element name="tipo" type="xsd:string" minOccurs="0"/>
21
<xsd:element name="misto" type="Misto" minOccurs="0"/>
22
<xsd:element name="mod" type="xsd:string" minOccurs="0"/>
23
<xsd:element name="nome" type="xsd:string"/>
24
</xsd:sequence>
25
26
27
</xsd:complexType>
...
</xsd:schema>
Figura 8 – Parte de um documento XML Schema
A arquitetura JAXB utiliza das informações disponibilizadas pelo esquema para a
geração das classes com o objetivo de manipular os documentos XML que estão de acordo
com o esquema.
37
3. MATERIAIS E MÉTODOS
3.1
Local e Período
As pesquisas foram realizadas no Núcleo de Desenvolvimento de Software (NDS)
do Centro Universitário Luterano de Palmas, localizado no prédio do curso de Sistemas de
Informação, sendo desenvolvido no segundo semestre de 2003.
3.2
Materiais
Os recursos utilizados foram em sua maioria hardware e software disponibilizados
no próprio laboratório. Algumas ferramentas gratuitas, disponíveis na Web, também foram
utilizadas. O sistema operacional utilizado foi o Windows 2000 Professional instalado
juntamente com os softwares XML Writer, XMLSPY e o SmartDraw 6, ambos aplicativos
de versão experimental. As ferramentas utilizadas como suporte foram o Adobe Acrobat 5,
Adobe Distiller 5 e o Winzip 8. A linguagem escolhida para o desenvolvimento da
ferramenta foi Java juntamente com a arquitetura JAXB. O microcomputador utilizado
possui a seguinte configuração básica: Pentium III, 750 Mhz, 20 Gb com 128 MB de
memória RAM.
3.3
Metodologia
Um levantamento teórico sobre as principais definições de esquemas para
documentos XML tornou-se necessário para que o objetivo final do trabalho fosse
alcançado. A escolha da estrutura para a realização da integração foi concluída logo em
38
seguida. Posteriormente foram realizadas, quase que simultaneamente, as alterações em um
parser DTD para converter os esquemas em um formato XML e a geração de um
documento XML Schema com base nas alternativas possíveis dos arquivos convertidos.
Utilizando-se do esquema gerado para os arquivos convertidos, a arquitetura JAXB gerou
uma série de classes e métodos para manipulação de qualquer documento XML válido de
acordo com o esquema. Essas classes permitiram a integração dos esquemas (convertidos
em arquivos XML) mais facilmente e uma posterior conversão ao formato original após o
processo de integração. Os testes foram realizados juntamente com o desenvolvimento da
ferramenta, observando uma série de situações específicas que podem ocorrer em um
processo de integração.
39
4. RESULTADOS E DISCUSSÕES
4.1
Proposta
O gerenciamento de dados heterogêneos é uma área de pesquisa crescente na
comunidade de banco de dados desde a década de oitenta. Os avanços ocorridos com a
computação distribuída e redes de computadores, juntamente com o crescimento da
necessidade de compartilhar informações entre diferentes plataformas e aplicações de
gerenciamento de dados, impulsionaram ainda mais pesquisas relacionadas a essa área
(MELLO, 2002).
Atualmente, a utilização da linguagem XML como alternativa para a troca de
informações
entre
plataformas
e
aplicações
diferentes
pode
ser
uma
saída
consideravelmente satisfatória. Por ser uma linguagem aparentemente simples e
independente da plataforma que se está utilizando, sua aceitação e utilização são
crescentes, tanto em áreas acadêmicas quanto em comerciais. O crescente número de
publicações relacionadas a essa nova tecnologia e o aumento do número de ferramentas
que dão suporte à mesma são provas do seu crescimento e aceitação.
A estruturação dos dados que aparentemente não apresentam muita semelhança
também pode ser alcançada com a utilização da linguagem XML. Uma característica
marcante dessa linguagem é dar uma certa estrutura aos dados considerados irregulares,
que não seguem uma estrutura bem definida. Apesar do foco principal deste trabalho estar
restrito à utilização da linguagem XML, as questões relacionadas no início desta seção
podem justificar sua escolha.
Uma característica própria dos dados semi-estruturados representados pela
linguagem XML está relacionada à diversidade com que os dados estão organizados. É
40
extremamente comum a existência de documentos referentes a um mesmo domínio,
estruturados de formas bem diferentes. Como a definição dos elementos e atributos que
compõem os documentos é de responsabilidade de seus usuários, e normalmente depende
do tipo de problema que se deseja resolver, a estruturação de um documento XML torna-se
bastante subjetiva.
Normalmente, as aplicações que trabalham com documentos XML baseiam-se em
uma estrutura de definição de documentos. Essas estruturas normalmente possuem a
responsabilidade de explicar ou restringir um ou mais documentos relacionados. Vistas
desta forma, essas estruturas são consideradas esquemas para documentos XML. Como as
variações entre as estruturas dos documentos XML podem ser muito grande, normalmente
as aplicações que manipulam esses documentos usam o esquema como base para acessar
os dados contidos nesse documento.
A estrutura de definição de documentos aparentemente mais utilizada é a DTD.
Considerada uma estrutura bastante simples e de fácil entendimento, sua aprendizagem
está inteiramente relacionada a aprendizagem da linguagem XML. Mesmo após o
surgimento da linguagem XML Schema (W3C CONSORTIUM, 2003), padrão
especificado pela W3C como esquema para documentos XML, a DTD ainda é bastante
utilizada, principalmente pela aparente complexidade que envolve a utilização desse novo
padrão.
Documentos XML podem existir isoladamente, sem a necessidade de um esquema
relacionado. Normalmente, as aplicações que necessitam de um esquema para se
beneficiarem das informações contidas no documento geram automaticamente essa
estrutura a partir dos dados contidos no documento. O esquema gerado, no exemplo a
DTD, é totalmente baseado na estrutura do documento relacionado e não permite, na
maioria das vezes, uma variação na estrutura do documento. Resumidamente, a DTD
gerada só possui valor para aquele determinado documento. Outros documentos XML
referentes ao mesmo domínio podem não ser validados pela DTD gerada anteriormente,
sendo normalmente necessário a geração de uma DTD para cada documento XML.
A geração de DTD para cada documento ocorre porque grande parte das DTDs
geradas automaticamente são restritas aos documentos que estão relacionadas. Como
normalmente a aplicação utiliza o esquema para acessar os documentos, o ideal seria que
todos os documentos seguissem um único esquema ou que os esquemas existentes fossem
integrados. A segunda alternativa foi a escolhida nesse trabalho
41
A arquitetura proposta nesse trabalho apresenta as seguintes etapas conforme a
figura 8:
Figura 8 – Arquitetura de integração de esquemas
•
A primeira etapa é a geração de uma DTD para o documento XML desejado. Esta
etapa é opcional e depende da inexistência de uma DTD relacionada ao documento.
A ferramenta DTDGenerator (DTDGenerator, 2003) gera automaticamente uma
DTD para o documento XML de entrada. É necessário que o documento de entrada
seja válido de acordo com a especificação dada pela W3C.
•
A segunda etapa é a conversão da DTD para um documento XML. Essa conversão
obedece a uma ordem específica necessária para que a aplicação realize a
integração. É importante ressaltar que a conversão realizada nessa etapa tem o
objetivo único de converter a estrutura da DTD para um documento XML. A
42
existência
de
mecanismos
que
manipulam
satisfatoriamente
documentos
estruturados com a linguagem XML torna essa conversão apropriada. Manipular
arquivos XML é mais fácil que manipular arquivos de texto comum.
•
A terceira etapa é a integração dos esquemas. Baseando-se na estrutura esperada, a
ferramenta de integração faz uma leitura dos arquivos convertidos e gera na saída
uma DTD integrada das estruturas dadas como entrada. A DTD gerada deve
obrigatoriamente validar todos os arquivos XML relacionados às DTD’s. Nessa
etapa é utilizada a Arquitetura JAXB para realizar a integração.
A ferramenta de integração de esquemas proposta nesse trabalho é a PINAJÉ. Para
sua utilização, é importante ressaltar três pontos relevantes:
•
Todos os documentos devem obrigatoriamente possuir o mesmo elemento raíz;
•
Tipos enumerados para atributos não podem iniciar com números. A figura abaixo
exemplifica essa restrição.
1
<!ATTLIST email mes (1|2|3|4|5|6|7|8|9|10|11|12)>
Figura 9 – Exemplo de declaração de atributo não permitida
•
Elementos declarados com o operador de cardinalidade “*” após os parênteses não
são validados pelo parser utilizado no processo. As exceções são os elementos
mistos.
1
<!ELEMENT lista ( item )* >
Figura 10 – Exemplo de declaração de elemento não permitida
A maior parte das restrições identificadas acima não foram impostas pela
ferramenta PINAJÉ propriamente, e sim pela ferramenta DTDParser que é utilizada no
processo de integração de esquemas proposto nesse trabalho, mais especificamente na
etapa de conversão da DTD para um documento XML.
4.2
Estudo de caso
O processo de integração apresentado nesse trabalho parte do pressuposto que os
arquivos XML utilizados como entrada são referentes a um mesmo domínio, e
43
possivelmente utilizados para solucionar um problema único. Como exemplo, serão
utilizados documentos XML referentes a monografias de acadêmicos de instituições que
possuem estruturas diferentes e seguem seus próprios formatos.
A escolha do domínio de monografias pode ser justificada de várias formas. Por ser
uma fonte de pesquisa bastante interessante e comumente utilizada dentro e fora das
instituições, o armazenamento destes dados para uma posterior consulta torna-se
interessante. Porém, a estrutura desses documentos pode variar bastante, mesmo quando as
monografias seguem as mesmas normas. É importante ressaltar que os documentos
mencionados nesse trabalho estão representados em XML, logo podem existir variações
significantes em suas estruturas.
A existência de partes opcionais pode ser considerada uma característica das
monografias. Agradecimentos, dedicatória, anexos, catalogação, lista de abreviaturas, etc,
podem ser partes opcionais de um trabalho de graduação. Outra característica é a
indefinição da seqüência dos elementos dentro de uma seção. Uma seção pode ser formada
por: parágrafo + figura + parágrafo ou parágrafo + tabela + tabela + parágrafo ou por
outra seqüência lógica obedecendo às restrições impostas normalmente pela instituição e
influenciadas pela escolha do autor.
Para exemplificar a realização da integração de esquemas proposta neste trabalho, a
figura 11 representa a estrutura de um documento XML referente ao domínio monografia.
Como já foi citada anteriormente, essa etapa do processo de integração é opcional e
depende da existência das DTD’s referente a cada documento XML. O processo de
integração apresentado como exemplo nesse trabalho parte da suposição que os
documentos XML podem não possuir nenhum esquema relacionado, mais especificamente
nenhuma DTD.
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<monografia>
3
<capa>
4
<logomarca>CEULP / ULBRA</logomarca>
5
...
10
</capa>
11
<contracapa>
12
<logomarca>CEULP / ULBRA</logomarca>
13
<instituicao>Centro Universitario Luterano de Palmas</instituicao>
14
<titulo>DTD</titulo>
44
15
<autor>Marcus Pinto</autor>
16
<orientador>Deise de Brum</orientador>
17
<local>Palmas</local>
18
<ano>2003</ano>
19
</contracapa>
20
<agradecimento>Agradeco...</agradecimento>
31
<listadetabelas> ...
34
</listadetabelas>
35
<resumo>...
39
</resumo>
40
<abstract>...
44
</abstract>
45
<corpo>
46
<capitulo numero="1" pagina="8" titulo="Introducao">
47
<paragrafo>texto</paragrafo>
48
<secao numero="1" pagina="8" titulo="subIntroducao">
49
<paragrafo>texto</paragrafo>
50
<figuraCorpo number="1" pag="15">nome</figuraCorpo>
51
<paragrafo>texto</paragrafo>
52
</secao>
53
</capitulo>
62
<capitulo numero="3" pagina="20" titulo="Materiais e Metodos">
63
<paragrafo>texto</paragrafo>
64
<lista>
65
<item>item#1</item>
66
<item>item#2</item>
67
<item>item#3</item>
68
</lista>
69
<paragrafo>texto</paragrafo>
70
71
72
73
74
</capitulo>
</corpo>
<referencias>texto</referencias>
<anexos>texto</anexos>
</monografia>
Figura 11 – Parte de um documento XML representando uma monografia
Apesar da estrutura do documento XML representado pela figura 11 estar
relacionada às normas especificadas pela instituição onde a monografia foi escrita, a
estruturação dos elementos é bastante subjetiva. Os documentos XML utilizados como
45
entrada para o processo de integração, as DTD’s geradas e as representações em XML das
DTD’s podem ser encontrados na seção de anexos deste trabalho.
4.3
Geração de DTD a partir de um documento XML
Para a geração dos esquemas para os documentos XML utilizados como entrada para
o processo de integração, é utilizada uma ferramenta que gera automaticamente a DTD
para cada documento relacionado. A única restrição encontrada na utilização dessa
ferramenta para a geração automática da DTD é a obrigatoriedade do documento XML ser
bem-formado. De acordo com (ANDERSON, 2001), para que um documento XML seja
considerado bem-formado, este deve obedecer às seguintes regras:
•
Obedecer às especificações XML;
•
Os elementos devem formar uma árvore hierárquica, contendo um único nó raiz;
•
Não poderá existir referência a entidades externas; salvo se fornecida a DTD
relacionada.
A ferramenta escolhida para a geração automática da DTD é a DTDGenerator, um
programa que realiza um exame no documento XML de entrada e produz como saída uma
DTD para o documento. O esquema gerado normalmente não permite muitas variações na
estrutura do documento referenciado, portanto, mesmo se tratando de documentos XML
relacionados a um mesmo domínio e utilizando os mesmos elementos e atributos, essa
ferramenta pode gerar esquemas diferentes para cada um dos documentos.
A ferramenta DTDGenerator gera um esquema a partir do documento XML, com
base em uma série de constantes numéricas que o auxiliam na determinação de alguns tipos
para elementos e atributos. Como exemplo da utilização dessas variáveis, pode-se citar a
identificação de valores enumerados para atributos. Essas constantes são a base para a
definição do tipo de grande parte dos elementos e atributos que compõem o documento.
A DTDGenerator (DTDGenerator, 2003) faz uma listagem de todos os elementos e
atributos que aparecem no documento XML, observando como estão organizados
hierarquicamente e anotando que elementos contém dados de caracteres. A DTD é gerada
de acordo com as seguintes regras:
•
Se um elemento contém dados de caracteres e elementos filhos, a ferramenta então
o identifica como um elemento misto que contém todos os elementos identificados
46
como filhos. Um elemento também será considerado misto se em algum momento
existirem duas instâncias diferentes para esse mesmo elemento: em um primeiro
momento um determinado elemento é do tipo string, posteriormente, esse mesmo
elemento aparece formado com outros elementos filhos.
•
Se nenhum caractere for encontrado em um elemento, a ferramenta parte da
suposição que o elemento não pode conter dados de caractere.
•
Se um elemento contém somente elementos filhos, então declara-se o elemento
superior como sendo o pai e os demais elementos como filhos. Se os elementos
filhos ocorrem em cada instância do elemento pai e em uma seqüência única, esta
seqüência deverá ser obedecida na declaração do elemento. Se os elementos filhos
forem repetidos ou omitidos em alguns exemplos do elemento pai, estes serão
declarados como multivalorado ou opcionais, podendo ser ambos (+,?,*). Caso não
seja detectada nenhuma seqüência consistente entre os elemento filhos, será
assumido que pelo menos um desses elementos pode ocorrer uma ou mais vezes e
em qualquer ordem.
•
Se não forem encontrados nenhum elemento filho e nenhum dado de caractere para
determinado elemento, a ferramenta supõe que o elemento seja vazio.
•
Um atributo que aparece em todas as ocorrências de um determinado elemento será
considerado um atributo obrigatório.
•
Todo atributo que contenha no mínimo 10 ocorrências diferentes e no máximo de
100.000, será considerado um atributo de identificação único (ID).
•
Um atributo será considerado do tipo enumerado se tiver menos de 20 valores
distintos, contanto que o número de instâncias do atributo seja pelo menos três
vezes maior que o número de valores distintos.
Como já foi citado anteriormente, a geração de esquemas (DTD’s) realizada pela
ferramenta DTDGenerator é baseada em uma série de regras determinadas pelo
desenvolvedor e com características bastante subjetivas. As regras citadas anteriormente
são baseadas nas constantes numéricas existentes no código fonte da ferramenta. Desta
forma, as regras podem ser alteradas de acordo com a necessidade do usuário, pois a
ferramenta disponibiliza seu código fonte.
A partir do documento XML referente à figura 11 foi gerada uma DTD que será
utilizada no processo de integração. A figura abaixo representa a DTD gerada.
47
1
<!ELEMENT abstract ( textoAbstract, keyword+ ) >
2
<!ELEMENT agradecimento ( #PCDATA ) >
3
<!ELEMENT anexos ( #PCDATA ) >
4
<!ELEMENT ano ( #PCDATA ) >
5
<!ELEMENT autor ( #PCDATA ) >
6
<!ELEMENT capa ( logomarca, instituição, titulo, autor, local, ano ) >
7
<!ELEMENT capitulo ( lista | paragrafo | secao )+ >
8
<!ATTLIST capitulo numero NMTOKEN #REQUIRED >
9
<!ATTLIST capitulo pagina NMTOKEN #REQUIRED >
10
<!ATTLIST capitulo titulo CDATA #REQUIRED >
11
<!ELEMENT contracapa ( logomarca, instituicao, titulo, autor, orientador, local, ano ) >
12
<!ELEMENT corpo ( capitulo+ ) >
13
<!ELEMENT figura ( #PCDATA ) >
14
<!ATTLIST figura numero NMTOKEN #REQUIRED >
15
<!ATTLIST figura pagina NMTOKEN #REQUIRED >
16
<!ELEMENT figuraCorpo ( #PCDATA ) >
17
<!ATTLIST figuraCorpo number NMTOKEN #REQUIRED >
18
<!ATTLIST figuraCorpo pag NMTOKEN #REQUIRED >
19
<!ELEMENT instituicao ( #PCDATA ) >
20
<!ELEMENT item ( #PCDATA ) >
21
<!ELEMENT keyword ( #PCDATA ) >
22
<!ELEMENT lista ( item+ ) >
23
<!ELEMENT listadefiguras ( figura+ ) >
24
<!ELEMENT listadetabelas ( tabela+ ) >
25
<!ELEMENT local ( #PCDATA ) >
26
<!ELEMENT logomarca ( #PCDATA ) >
27
<!ELEMENT monografia ( capa, contracapa, agradecimento, sumario+, listadefiguras,
listadetabelas, resumo, abstract, corpo, referencias, anexos ) >
28
<!ELEMENT orientador ( #PCDATA ) >
29
<!ELEMENT palavraChave ( #PCDATA ) >
30
<!ELEMENT paragrafo ( #PCDATA ) >
31
<!ELEMENT referencias ( #PCDATA ) >
32
<!ELEMENT resumo ( textoResumo, palavraChave+ ) >
33
<!ELEMENT secao ( figuraCorpo | paragrafo | subsecao )+ >
34
<!ATTLIST secao numero NMTOKEN #REQUIRED >
35
<!ATTLIST secao pagina NMTOKEN #REQUIRED >
36
<!ATTLIST secao titulo NMTOKEN #REQUIRED >
37
<!ELEMENT subsecao EMPTY >
38
<!ELEMENT sumario ( titulo ) >
39
<!ATTLIST sumario numero NMTOKEN #REQUIRED >
48
40
<!ATTLIST sumario pag NMTOKEN #REQUIRED >
41
<!ELEMENT tabela ( #PCDATA ) >
42
<!ATTLIST tabela numero NMTOKEN #REQUIRED >
43
<!ATTLIST tabela pagina NMTOKEN #REQUIRED >
44
<!ELEMENT textoAbstract ( #PCDATA ) >
45
<!ELEMENT textoResumo ( #PCDATA ) >
46
<!ELEMENT titulo ( #PCDATA ) >
Figura 12 - DTD gerada a partir de um documento XML
A DTD gerada pela ferramenta DTDGenerator é apenas um dos possíveis
esquemas que podem ser gerados com base no documento de entrada. A DTD gerada pode
ser examinada e editada para descrever mais precisamente o documento relacionado. Para
a utilização nesse trabalho, não foi detectada a necessidade de qualquer tipo de
modificação na DTD resultante, porém é possível que em alguns casos possa ser necessário
realizar algumas alterações. A etapa de conversão da DTD para uma representação XML
determinará a necessidade ou não da realização de pequenas alterações no esquema gerado.
A DTD acima e as demais DTD’s geradas com base nos documentos XML podem ser
encontradas na seção de anexos desse trabalho.
4.4
Representação da DTD em formato XML
A aceitação e o crescimento da linguagem XML incentivou um número
considerável de pesquisas relacionadas a essa nova tecnologia. Como resultado, existe um
grande número de ferramentas que dão suporte e possibilitam o processamento de
documentos representados através dessa linguagem. Em contrapartida, os avanços com o
processamento de DTD’s não ocorreram na mesma proporção. Por conveniência, optou-se
por representar cada DTD através de um documento XML. Para efetuar essa conversão, foi
utilizado a ferramenta DTDParser (DTDParser, 2003), originalmente um parser para
verificação de DTD. As alterações realizadas no código fonte dessa ferramenta tornaram-se
necessárias para que o resultado desejado fosse alcançado. A eliminação das mensagens de
erros e a geração de um documento XML podem ser citados como exemplos das alterações
realizadas na ferramenta.
Um analisador léxico possui a responsabilidade de ler uma série de caracteres de
entrada, produzindo uma seqüência de tokens de nome que um determinado parser
49
utilizará para sua análise sintática. O analisador sintático é responsável pela verificação
dessa seqüência de tokens lidas pelo analisador léxico, observando se essa cadeia de tokens
pode ser gerada pela gramática da linguagem (AHO, 1995).
As metas a serem alcançadas em um analisador sintático são (AHO, 1995):
•
Relatar a presença de erros claramente;
•
Identificar todos os erros que se encontram no código fonte;
•
Não diminuir o desempenho no processamento de programas que não contenham
erros;
Com as alterações realizadas no código fonte da DTDParser, essa ferramenta além
de verificar se uma determinada DTD é válida, produz como saída um documento XML
que representa fielmente o arquivo de entrada de acordo com o que é pretendido pela
proposta para a realização da integração.
A figura 13 abaixo representa parte da DTD da figura 12 utilizando a linguagem
XML. O código de todas as DTD’s representadas pela linguagem XML podem ser
encontradas na seção de anexos do referente trabalho.
1
2
3
4
5
<raiz>
29
<Elemento>
<pai>
<filho>
<nome>textoAbstract</nome>
30
<tipo>NMTOKEN</tipo>
32
<padrao>REQUIRED</padrao>
33
<nome>numero</nome>
</filho>
34
7
< delimitador >|</delimitador>
35
<filho>
<Atributo>
31
6
8
<Atributos>
</Atributo>
<ElementoRef>capitulo</ElementoRef>
36
</Atributos>
9
<mod>+</mod>
37
<Atributos>
10
<nome>keyword</nome>
38
<Atributo>
11
</filho>
39
<tipo>NMTOKEN</tipo>
12
<nome>abstract</nome>
40
<padrao>REQUIRED</padrao>
41
<nome>pagina</nome>
13
</pai>
14
</Elemento>
42
15
<Elemento>
43
16
<pai>
</Atributo>
<ElementoRef>capitulo</ElementoRef>
44
</Atributos>
...
17
<pcdata>PCDATA</pcdata>
45
18
<nome>agradecimento</nome>
46
<Elemento>
47
<pai>
19
</pai>
20
</Elemento>
48
21
<Elemento>
49
<filho>
<nome>lista</nome>
50
22
<pai>
50
23
<pcdata>PCDATA</pcdata>
51
24
<nome>anexos</nome>
52
25
</pai>
</filho>
< delimitador >|</delimitador>
<filho>
53
<nome>paragrafo</nome>
26
</Elemento>
54
27
<Elemento>
55
...
56
<raiz>
28
...
</filho>
Figura 13 - DTD representada por um documento XML
4.5
A ferramenta PINAJÉ
A ferramenta PINAJÉ foi desenvolvida com o objetivo de integrar esquemas para
documentos XML; essa integração obedece a uma série de regras definidas pelo
desenvolvedor para alcançar o objetivo desejado. As regras definidas para o processo de
integração visam o enquadramento de todos os documentos, que antes estavam de acordo
com seus respectivos esquemas, a um único esquema obedecendo as restrições
apresentadas no seção 4.1.
4.5.1 O processo de Integração da ferramenta
O processo de integração utilizado pela ferramenta PINAJÉ é relativamente
simples, uma vez que não se preocupa com a semântica dos dados. Apenas a parte
sintática, a localização e a hierarquia dos dados são observados nesse processo de
integração. Deste modo, é possível que existam duplicações de informações no esquema
integrado. A afirmação acima pode ser entendida quando uma mesma informação está
apresentada de formas diferentes em cada fonte. Conseqüentemente, a ferramenta
DTDGenerator gerará esquemas diferentes para cada uma das fontes. Como a DTD
integrada deve conter todas as informações das DTD’s de entrada, esta conterá as duas
informações.
A integração realizada pela ferramenta segue os seguintes passos:
•
Para o primeiro documento passado como argumento é identificada sua extensão
(tipo). Caso seja um documento XML, é gerado uma DTD e feita a conversão para
51
um formato .xml. Se for uma DTD, o primeiro passo acima é omitido. Esse arquivo
é considerado pela aplicação como o esquema principal;
•
Para os demais documentos, são seguidos os mesmos passos da seção anterior. A
aplicação considera os demais arquivos como esquemas secundários. O processo de
integração é realizado somente entre dois arquivos por vez. O resultado de cada
integração é armazenado no esquema principal, ficando à espera de outro esquema
secundário. O processo se repete até que acabem os arquivos de entrada.
•
Para cada elemento do esquema secundário, é feita a verificação da sua existência
no esquema principal. Caso não exista nenhum elemento no esquema principal que
possua o mesmo nome do elemento do esquema secundário, ele então é inserido no
esquema principal. Se ele já existe:
o É verificado se possuem tipos diferentes. Possuindo nomes iguais e tipos
diferentes a integração é realizada da seguinte forma:
Se o elemento referente ao esquema principal tiver somente filhos:
•
se o elemento referente esquema secundário for do tipo
PCDATA,
então o elemento no esquema principal torna-se um
elemento misto com seus elementos filhos;
•
se o elemento referente ao esquema secundário for do tipo
ANY,
então o elemento referente ao esquema principal torna-
se um ANY;
•
se o elemento referente ao esquema secundário for do tipo
EMPTY,
então o modificador do elemento referente ao
esquema principal é alterado para “*”.
•
se o elemento no esquema secundário for misto, então
transforma o elemento do esquema principal em um
elemento misto e faz a integração dos dois elementos mistos.
Se o elemento referente ao esquema principal for do tipo EMPTY:
•
se o elemento referente ao esquema secundário tiver somente
filhos, então o elemento referente ao esquema principal
recebe o elemento do esquema secundário, alterando seu
modificador para “*”.
52
•
se o elemento referente ao esquema secundário for do tipo
ANY, PCDATA
ou
misto,
realiza o mesmo procedimento
anterior, apenas não alterando o modificador.
Se o elemento referente ao esquema principal for do tipo PCDATA:
•
se o elemento referente ao esquema secundário tiver apenas
filhos, então o elemento no esquema principal torna-se um
elemento misto com os filhos do elemento do esquema
secundário;
•
se o elemento no esquema secundário for do tipo
ANY,
então
o elemento do esquema principal muda seu tipo para ANY.
o Possuindo tipos e nomes iguais o processo é realizado da seguinte forma:
Se forem elementos que possuam apenas elementos filhos, então é
realizada a integração dos elementos filhos no esquema principal. O
elemento pai resultante da integração deverá conter seus filhos
originais e os filhos do elemento secundário. Quando existirem
elementos filhos com nomes iguais em ambos os esquemas, estes
não são inseridos no esquema principal, pois já existem;
Se forem elementos mistos, então é realizada a integração desses
elementos filhos. Para a existência de elementos filhos com nomes
iguais, o mesmo procedimento da seção anterior é realizado.
•
O procedimento para a integração de atributos é bastante semelhante ao processo de
integração de elementos. Para cada atributo do esquema secundário é verificado sua
existência no esquema principal com o mesmo nome do elemento relacionado, pois
é possível que existam atributos iguais em elementos diferentes. Caso o atributo
referente ao elemento não exista no elemento de mesmo nome no esquema
principal, ele é inserido no esquema principal no mesmo elemento. Se ele já existe:
o É verificado se possuem tipos iguais e se estão relacionados a elementos
com mesmo nome. Caso sejam iguais:
é verificada a declaração padrão (REQUIRED,
IMPLIED
etc). Se forem
iguais, é realizada a integração para os tipos enumerados e para o
tipo notação. Se não for de nenhum tipo acima, nada é feito. Em
seguida, é verificado se o tipo é
CDATA
com valores default
diferentes ou do tipo FIXED com valores default diferentes. Caso uma
53
das afirmações acima seja verdadeira, o atributo é modificado para
IMPLIED
sem valor default.
Se a declaração padrão for diferente:
•
Se o padrão de declaração referente ao atributo principal for
REQUIRED
e o padrão de declaração do atributo do esquema
secundário for
IMPLIED,
então o atributo referente ao
esquema principal é modificado para IMPLIED;
•
Se o padrão de declaração referente ao atributo principal for
FIXED,
então o atributo referente ao esquema principal é
modificado para IMPLIED e sem valor default .
o Se o atributo possui nomes iguais, tipos diferentes e estão relacionados com
elementos de nomes iguais em ambos os esquemas:
o tipo do atributo referente ao esquema principal é alterado para
CDATA
com padrão de declaração IMPLIED.
4.5.2 Utilização
O propósito da ferramenta PINAJÉ resume-se na integração de esquemas para
documentos XML expressos através de DTD’s. A ferramenta disponibiliza ao usuário três
formas distintas para iniciar o processo de integração:
•
apenas com documentos XML;
•
apenas com documentos DTD;
•
com documentos XML e DTD;
Não existe um limite definido para a quantidade de arquivos passados como
argumentos para iniciar o programa. Uma possível limitação será imposta pela linguagem
Java ou pelo sistema operacional e não pela aplicação propriamente (limitação do número
de argumentos por exemplo).
Para utilização da ferramenta, os seguintes requisitos devem ser observados:
•
J2SDK e o Java Web Services contem alguns arquivos utilizados pela ferramenta.
Sua instalação é recomendada;
•
É necessário criar uma pasta para os arquivos e incluí-la no CLASSPATH ;
54
•
O arquivo var.bat deve ser analisado, onde o diretório do J2SDK deve ser corrigido
caso exista necessidade. Essa verificação torna-se necessária devido à quantidade
de versões do J2SDK onde cada uma possui um diretório padrão distinto. ex: c:\
j2sdk1.4.0, c:\ j2sdk1.4.1, etc.
•
No mínimo dois arquivos devem ser passados como argumento para o programa;
•
O elemento raiz de cada documento deve ser o mesmo;
•
Ambos os arquivos devem ser válidos de acordo com a especificação da W3C;
•
Nenhum elemento pode possuir apenas um caractere. ex:<!ELEMENT a (#PCDATA)>
•
Atributos enumerados não podem iniciar com números;
•
Elementos declarados com o operador de cardinalidade “*” após os parênteses não
são validados pelo parser utilizado no processo. A única exceção são os elementos
mistos.
Os arquivos de entrada utilizados no processo de integração não são modificados
pela ferramenta PINAJÉ. Apenas são gerados novos arquivos pelas ferramentas
DTDGenerator e DTDParser. A tabela abaixo exemplifica como são escolhidos os nomes
dos arquivos gerados.
Tabela 3– Nomenclatura dos arquivos gerados pelas ferrementas
Ferramenta
arquivo de entrada
arquivo de saída
DTDGenerator
arquivo.xml
arquivon.dtd
DTDParser
arquivo.dtd
arquivo.xml
onde n é igual a 1,2,3,4...
Quando o arquivo de entrada é um documento XML, as ferramentas
DTDGenerator e DTDParser são utilizadas nesta mesma sequência, não existindo a
necessidade da alteração do nome do arquivo pela ferramenta DTDParser, apenas na
extensão do mesmo. ex: arquivo.xml => arquivo1.dtd => arquivo1.xml.
A ferramenta PINAJÉ, bem com as ferramentas que foram acopladas
(DTDGenerator e DTDParser), necessitam que algumas informações sejam inseridas nas
variáveis de ambiente para funcionarem. Essa inclusão pode ser feita através da execução
55
do arquivo var.bat existente no pacote da ferramenta. ex: c:\diretorio_pinaje\var.bat
seguido de <enter>.
Para iniciar o processo de integração proposto nesse trabalho, deve-se direcionar até
o local onde os arquivos foram salvos, executar o arquivo var.bat e a ferramenta PINAJÉ
com no mínimo dois argumentos. A figura representada abaixo exemplifica o processo de
utilização da ferramenta em questão:
1
java PINAJE arquivo_entrada1 arquivo_entrada2 > arquivo_saida.dtd
Figura 14 – Exemplo da utilização da ferramenta PINAJÉ com dois arquivos
A DTD integrada gerada pela ferramenta PINAJÉ é apenas um dos possíveis
esquemas que podem ser integrados com base nos documentos de entrada. A DTD gerada
pode ser examinada e editada para descrever mais precisamente os documentos
relacionados. As regras de integração utilizadas pela ferramenta podem comprometer
algumas restrições impostas pelas DTD’s. A DTD menos restrita se impõe sobre as demais
e influencia na formação do documento gerado.
4.5.3 Arquivos de entrada
A ferramenta PINAJÉ foi implementada na linguagem Java, utilizando a arquitetura
JAXB para acessar os documentos, realizar a integração e gerar um arquivo com extensão
.dtd com saída. Como já foi citado anteriormente, a tecnologia JAXB provê uma série de
classes com métodos bem flexíveis para manipular documentos XML. As classes e os
métodos gerados pela arquitetura citada são baseados no documento XML Schema
utilizado pela tecnologia JAXB.
O primeiro passo da ferramenta PINAJÉ é a verificação da extensão dos arquivos
de entrada. A classe PINAJÉ disponibiliza dois métodos com a responsabilidade de
verificar o tipo dos arquivos. Cabe ao método
ehXML(String nome)
informar se o arquivo
passado como parâmetro é um documento XML. O método ehDTD(String nome) informa se
o arquivo passado como parâmetro possui nome com extensão .dtd. Ambos os métodos
retornam true ou false, dependendo da extensão dos arquivos.
Se o documento usado como entrada para o processo de integração for um arquivo
com extensão .xml, é criado um processo paralelo onde a ferramenta DTDGenerator
56
modificada é executada. Como nova saída, tem-se um documento DTD gerado a partir do
documento XML dado como entrada para o processo. Quando esse processo é finalizado, é
criado um novo processo paralelo onde a ferramenta DTDParser, também alterada, é
executada, gerando um novo documento XML que será usado no processo de integração.
Quando o documento dado como entrada for um arquivo com extensão .dtd, apenas
a ferramenta DTDParser é utilizada, uma vez que não existe a necessidade da geração de
um documento DTD. É importante ressaltar que a ferramenta DTDParser possui como
maior responsabilidade a conversão do documento com extensão .dtd para um documento
XML, mas para que a ferramenta alcance seus objetivos é necessário que o documento
esteja de acordo com a especificação da W3C e obedeça às restrições apresentadas na seção
4.5.1.
4.5.4 Carregando documentos
A arquitetura JAXB disponibiliza uma forma para recuperar os dados contidos em
um documento XML e armazená-los na memória para aumentar o desempenho na
manipulação dos dados contidos no documento. É importante ressaltar que apenas os
documentos válidos de acordo com o XML Schema utilizado para a geração das classes
poderão ser carregados. Ignorar essa restrição ocasionará a geração de uma exceção
juntamente com a impossibilidade da continuação da execução do programa.
Para a realização da leitura de um documento XML, a arquitetura JAXB dispõe da
classe
Unmarshaller
que possui o método
unmarshal(...)
com a responsabilidade de
recuperar todos os dados do arquivo XML passado como parâmetro. A figura abaixo
exemplifica o processo de leitura de um documento xml.
1
...
2
JAXBContext jc = JAXBContext.newInstance( "primer.po" )
3
Unmarshaller u = jc.createUnmarshaller()
4
Raiz R = (Raiz)u.unmarshal( new FileInputStream( “arquivo.xml” ) )
5
ListaElementosAtributos = R.getElementoOrAtributos()
6
....
Figura 15 – Carregando um documento xml
57
A interface Raiz exemplificada na figura acima é a principal, onde os objetos dessa
classe são instanciados com a utilização do arquivo XML de entrada. Os objetos dessa
classe contem todos os dados do documento de entrada com métodos específicos para a
manipulação dos mesmos. O método
getElementoOrAtributos()
referente ao objeto
R
e
exemplificado na figura acima (linha 5), retorna uma lista de todos os atributos e elementos
que contem o documento XML.
O processo de integração utilizado pela ferramenta PINAJÉ carrega o primeiro
documento passado como parâmetro e o considera o esquema principal. Os próximos
arquivos serão considerados secundários, onde as mudanças ocorrerão somente no arquivo
principal (as alterações ocorrem somente em memória, não afetando os arquivos originais).
Resumidamente, esse processo de integração ocorre somente entre dois arquivos. O
resultado das integrações fica armazenado no documento principal e à espera do próximo
documento para realizar uma nova integração.
Tabela 4 – Exemplo do processo de integração
Passos
Documento
Documento
Processo de integração
Resultado da integração
1
arquivo1.xml
arquivo2.xml
⊕⊕⊕
arquivo1.xml
2
arquivo1.xml
arquivo3.xml
⊕⊕⊕
arquivo1.xml
3
arquivo1.xml
arquivo4.xml
⊕⊕⊕
arquivo1.xml
4
arquivo1.xml
arquivo5.xml
⊕⊕⊕
arquivo1.xml
5
...
...
...
arquivo1.xml
A tabela acima representa a seqüência utilizada pela ferramenta para a realização da
integração, onde as alterações são realizadas somente no primeiro documento que foi
carregado na memória. As iterações que ocorrem na execução da ferramenta dependem da
quantidade de argumentos que são passados na linha de comando.
4.5.5 Instanciando objetos
Após serem carregados os documentos de entrada, faz-se necessário a utilização de
quatro classes com funções bem definidas. As quatro classes criadas foram divididas de
acordo com suas funcionalidades e possuem responsabilidades distintas:
•
Classe PrintDTD
58
o Possui a responsabilidade de converter o documento XML, normalmente
integrado, para um documento DTD, apresentando o resultado ao usuário;
o Para instanciar um objeto dessa classe é necessário passar uma lista
contendo todos os elementos e atributos do documento a ser convertido
como construtor da classe.
•
Classe Novo
o Possui uma série de métodos com a responsabilidade de criar novos
elementos. Esses métodos são úteis, principalmente em situações que
exigem a criação de novos elementos quando seu aproveitamento no
processo de integração torna-se inviável ou quando o elemento só existe em
uma das bases;
o Para instanciar objetos dessa classe não é necessário passar nenhum
parâmetro.
•
Classe ManipulaElemento
o Todos os relacionamentos existentes entre os elementos das DTD’s a serem
integradas são de responsabilidade desta classe. Essa classe possui uma
serie de métodos que compartilham um objetivo em comum: a integração de
elementos;
o Objetos dessa classe necessitam de uma lista dos elementos e atributos que
compõem o documento XML para serem instanciados.
•
Classe ManipulaAtributo
o A integração dos atributos entre os documentos de entrada é de
responsabilidade dessa classe. Assim como a classe citada acima, a
instanciação de um objeto dessa classe exige uma lista dos elementos e
atributos que compõem o documento.
A figura 16 exemplifica a instanciação de todas as classes citadas anteriormente. A
lista de todos os elementos que compõem o documento é obtida através de um método da
interface
Raiz
exemplificado na figura 15, linha 5. Essa lista é na verdade todo o
documento, com elementos e atributos, e é utilizada pela maioria das classes.
1
...
2
PrintDTD Print = new PrintDTD(ListaElementosAtributos)
59
3
Classe Novo = new Novo()
4
ManipulaElemento MElemento = new ManipulaElemento(ListaElementosAtributos)
5
ManipulaAtributo MAtributo = new ManipulaAtributo(ListaElementosAtributos)
6
....
Figura 16 – Instanciando objetos
O objeto ListaElementoAtributo é um atributo da classe PINAJÉ que contém todos os
elementos e atributos do esquema definido como principal. O atributo ListaElemAtri também
é um atributo da mesma classe que é instanciado com todos os elementos e atributos dos
esquemas definidos como secundários.
4.5.6 Identificando elementos e atributos na lista
No processo de conversão da DTD para um documento XML, a ferramenta
DTDParser pega todo o conteúdo do documento original e o converte para uma série de
elementos, conforme foi abordado na seção 4.4 deste trabalho. Esses elementos foram
divididos em duas formas: os elementos que representam os elementos originais da DTD e
os elementos que representam todos os atributos do documento original. A tecnologia
JAXB gerou apenas um método único que retorna uma lista de todo o conteúdo do
documento original para a interface Raiz (figura 15).
Observa-se que a cada posição da lista é possível que exista um elemento ou um
atributo representado. Para identificação do tipo existente em cada posição da lista, a
seguinte alternativa foi escolhida: para cada posição, pega-se o nome da classe
representada na lista, compara com o nome da classe que trabalha com elementos; se forem
iguais, instancia um objeto
Elemento
na mesma posição da lista. Caso não seja um
elemento, então instancia-se um objeto Atributo. A figura 17 exemplifica esse processo:
1
...
2
ListaElemAtri = R2.getElementoOrAtributos();
3
for(int i=0; i< ListaElemAtri.size(); i++)
4
{
5
6
7
if(ListaElemAtri.get(i).getClass().getName().equals(classe_elemento)
|| ListaElemAtri.get(i).getClass().getName().equals(classe_elemento2))
{
60
8
Elemento E = (Elemento)ListaElemAtri.get(i);
9
....
10
}
11
else
12
{
13
Atributos As =(Atributos)ListaElemAtri.get(i);
14
...
15
}
16
17
}
...
Figura 17 – Identificando elementos e atributos
As variáveis constantes
classe_elemento
e
classe_elemento2
exemplificadas na
figura acima, nas linhas 5 e 6 respectivamente, são na verdade atributos da classe PINAJÉ
que contém o nome das classes que manipulam elementos. Como as classes foram geradas
automaticamente pela tecnologia JAXB, obedecendo ao esquema utilizado, duas classes
foram criadas com o mesmo objetivo: trabalhar com elementos. A figura 18 mostra parte
do esquema utilizado.
1
...
2
<xsd:complexType name="Raiz2">
3
<xsd:choice maxOccurs="unbounded">
4
<xsd:element name="elemento" type="Elemento"/>
5
<xsd:element name="atributos" type="Atributos" minOccurs="0"/>
6
</xsd:choice>
7
</xsd:complexType>
8
<xsd:complexType name="Elemento">
9
<xsd:sequence>
10
<xsd:element name="pai" type="Pai"/>
11
</xsd:sequence>
12
</xsd:complexType>
13
...
Figura 18 – Parte do esquema utilizado para a criação das classes
Observando o elemento complexo
Raiz2
representado na linha 2 da figura acima,
percebe-se que o mesmo pode ser formado por um ou muitos
elemento
ou zero ou muitos
atributos.
Na linha 8 da mesma figura tem-se a declaração de um elemento complexo
Elemento.
Para manipulação de elementos foi criada a interface
Elemento
referente ao
elemento complexo Elemento da linha 8. Mas na linha 4 existe um elemento desse mesmo
61
tipo; logo foi gerada uma nova interface com nome Raiz2.Elemento que herda de Elemento.
Essa duplicação de interfaces que manipulam os mesmos objetos também ocorre com
outros elementos desse mesmo esquema.
4.5.7 Classe ManipulaElemento
Como já foi mencionado anteriormente, todo objeto da classe
ManipulaElemento
é
instanciado utilizando a lista de elementos e atributos que contém todo o esquema definido
como principal. Normalmente os métodos referentes a essa classe recebem como
parâmetro alguma informação repassada pelo esquema considerado secundário e o utiliza
para uma possível integração. Os principais métodos dessa classe serão apresentados nas
seções subseqüentes.
4.5.7.1 Método nomeIgual(String nome)
Esse método é utilizado para realizar a verificação no esquema considerado
principal para confirmar uma possível existência de um elemento com o mesmo nome em
ambos os esquemas. Para isso é seguida a seguinte sequência, considerando que o esquema
principal já foi utilizado para a instanciação de um objeto da classe ManipulaElemento:
para cada elemento existente no esquema secundário, é verificado se existe um elemento
com o mesmo nome no esquema principal. O retorno desse método é do tipo boolean
podendo ser true ou false dependendo se existirem ou não elementos com os mesmos
nomes em ambos os esquemas.
4.5.7.2 Método nomeIgualTipoDiferente(String nome, String tipo)
Os dois parâmetros desse método
nome
e
tipo
são respectivamente o nome e o tipo
de um determinado elemento do esquema secundário. Esse método possui a
responsabilidade de informar se o esquemas possuem algum elemento com o mesmo nome
e com tipos diferentes. A figura representada abaixo exemplifica uma possível situação:
62
1
No esquema principal
No esquema secundário
2
<!ELEMENT usuario ( nome, dominio) >
3
...
<!ELEMENT usuario ( #PCDATA ) >
Figura 19 – Exemplos de elementos com mesmo nome e tipos diferentes
O método
nomeIgualTipoDiferente
da classe
ManipulaElemento
funciona de acordo
com os seguintes passos: inicialmente é verificado se existe no esquema principal um
elemento com o mesmo nome que foi passado como parâmetro; caso a afirmação seja
verdadeira, é buscado o tipo do elemento com base no nome que é novamente passado
como parâmetro para uma nova função,
retornaTipo(String nomeElemento),
que retorna o
tipo do elemento; após a obtenção do tipo do elemento no esquema principal, basta
compará-lo ao tipo do elemento do esquema secundário. A figura representada abaixo
mostra o código desse método.
1
2
public boolean nomeIgualTipoDiferente(String nome, String tipo)
if(nomeIgual(nome))
{
3
String type = retornaTipo(nome);
4
if(type == null)
5
return (tipo != null);
6
else
7
return(!type.equals(tipo))
8
}
9
else
10
11
{
return false;
}
Figura 20 – Exemplos do código do método nomeIgualTipoDiferente
Como pode ser observado no código representado pela figura 20, o método
nomeIgualTipoDiferente
é do tipo boolean, retornando true para a existência de elementos
com nomes iguais e tipos diferentes. Dentro da aplicação esse método só é executado após
a verificação da existência de elementos com nomes iguais em ambos os esquemas. Essa
alternativa
foi
utilizada
nomeIgualTipoDiferente
para
confirmar
a
seguinte
afirmação:
se
a
função
retornar false, então os tipos são iguais. Caso esse método fosse
utilizado sem essa restrição, a afirmação acima não seria verdadeira, pois quando os nomes
são diferentes em cada esquema, ela também retorna false.
63
4.5.7.3 Método integraNomeIgualTipoDiferente(Pai P)
Esse método é utilizado quando existe a necessidade da integração de dois
elementos com nomes iguais e tipos diferentes. O processo de integração utilizado
privilegia os tipos menos restritos ou cria-se um novo elemento com base nos elementos
de ambos os esquemas.
1
No esquema principal
No esquema secundário
2
<!ELEMENT nome ANY >
<!ELEMENT nome ( #PCDATA )>
3
Integração
4
<!ELEMENT nome ANY >
5
....
...
6
<!ELEMENT usuario ( nome, dominio) >
<!ELEMENT usuario ( #PCDATA ) >
7
Integração
8
<!ELEMENT usuario (#PCDATA | nome | dominio )*>
Figura 21 – Exemplos da integração de elementos
O parâmetro
Pai
do método acima contém as informações necessárias para a
realização da integração entre os elementos dos esquemas. Esse parâmetro representa um
elemento do esquema secundário. O figura 22 representada abaixo exemplifica parte do
código do método citado. Na linha 2 é obtido o tipo do elemento no esquema principal com
base no nome do elemento que foi passado como parâmetro.
1
public void integraNomeIgualTipoDiferente(Pai P){
2
String PrincTipo = retornaTipo(P.getNome());
3
4
if(PrincTipo = = null){
if(P.getTipo().equals("PCDATA"))
5
6
7
insereMisto(P.getNome());
...
else{
8
if(PrincTipo.equals("EMPTY")){
9
if(P.getTipo() = = null){
10
mudaPaiTipo(P.getNome(),"ANY");
11
....
12
if(PrincTipo.equals("PCDATA")){
13
if(P.getTipo() = = null)
14
15
insereMistoElemento(P);
else{
64
16
if(P.getTipo().equals("ANY")){
17
Elemento Elem = ClasseNovo.novoElemento(P);
18
removeElemento(P.getNome());
19
insereElemento(-1,Elem);
20
...
Figura 22 – Exemplos do código do método nomeIgualTipoDiferente
4.5.7.4 Método integraNomeIgualTipoIgual(Pai P)
O método
integraNomeIgualTipoIgual(Pai P)
da classe
ManipulaElemento
possui a
responsabilidade de integrar elementos com nomes iguais e tipos iguais. A utilização desse
método torna-se necessária quando são identificados em ambos os esquemas elementos
com nomes e tipos iguais mas que podem apresentar diferenças significativas. Como
exemplo das diferenças que podem ocorrer entre esquemas que possuem nomes e tipos
iguais pode-se citar os elementos formados por outros elementos. Apesar de possuírem os
mesmos nomes e o tipos, é possível que seus elementos filhos sejam diferentes.
1
esquema 1
esquema 2
2
<!ELEMENT autor (primeiroNome, sobrenome) >
<!ELEMENT autor ( nomeCompleto )>
Figura 23 – Exemplo de elementos diferentes com nomes e tipos iguais
Quando um determinado elemento possui apenas elementos filhos, como os
representados na figura 23, entende-se que seu tipo é nulo. Portanto os elementos
exemplificados acima possuem nomes e tipos iguais. Os elementos mistos também podem
ser citados como exemplo de elementos diferentes com nomes e tipos iguais. A figura
abaixo exemplifica parte do código desse método.
1
public void integraNomeIgualTipoIgual(Pai P){
2
if(P.getTipo() = = null)
3
integraPaiNulo(P);
4
else
5
if(P.getTipo().equals("misto"))
6
7
integraMisto(P.getNome(),P.getMisto());
}
Figura 24 – Código do método integraNomeIgualTipoIgual
65
O método
integraPaiNulo(Pai P)
referente a linha 3 da figura acima é responsável
pela integração de elementos que possuem apenas elementos filhos. Esse método faz a
verificação dos elementos filhos de cada elemento e os integra em um único elemento.
Além dessa integração, esse método também modifica os delimitadores do elemento
substituindo o delimitador “,” por “|” e acrescentando um modificador “*” ao elemento
“pai”. A figura abaixo exemplifica esse processo.
1
Esquema principal
Esquema secundário
2
<!ELEMENT autor (primeiroNome, sobrenome) >
<!ELEMENT autor ( nomeCompleto )>
3
processo de integração
4
<!ELEMENT autor (primeiroNome | sobrenome | nomeCompleto)* >
Figura 25 – Exemplo de integração de elementos com tipos nulos
A linha 6 da figura 24 exemplifica o método
integraMisto(String,Misto)
responsável
pela integração de elementos mistos. O processo utilizado para a integração de elementos
mistos é semelhante ao processo de integração de elementos com tipos nulos,
diferenciando-se apenas pelo fato que a integração de elementos mistos não exige uma
mudança na estrutura do elemento, apenas são acrescentados novos elementos ao elemento
referente ao esquema principal.
1
Esquema principal
Esquema secundário
2
<!ELEMENT pai (#PCDATA | filho | nome)*>
<!ELEMENT pai (#PCDATA | filho | mod )*>
3
processo de integração
4
<!ELEMENT pai (#PCDATA | filho | nome | mod)* >
Figura 26 – Exemplo de integração de elementos mistos
4.5.7.5 Método insereElemento(int indice, Elemento E)
O método
insereElemento(int, Elemento)
é utilizado quando existe um elemento no
esquema secundário que não existe no esquema principal. Para que o objetivo da
integração seja alcançado é necessário que o esquema principal (ou esquema final) suporte
66
todas as instâncias dos documentos XML suportados por cada esquema. Portanto torna-se
necessário a inclusão desse novo elemento no esquema principal.
1
public void insereElemento(int indice,Elemento E)
2
{
3
if(indice == -1)
4
ListaElementosAtributos.add(E);
5
else
6
7
ListaElementosAtributos.add(indice,E);
}
Figura 27 – Inserindo novos elementos
O parâmetro
indice
do método
insereElemento(...)
é utilizado para informar a
posição em que o novo elemento será inserido. Ele é bastante útil em situações que por
conveniência, um determinado elemento é substituído no processo de integração. Quando
esse parâmetro for igual a “–1” ele deverá ser desconsiderado e o elemento é inserido na
última posição. O parâmetro Elemento é o elemento que será inserido no esquema principal.
4.5.8 Classe ManipulaAtributo
Assim como a classe
ManipulaElemento,
a classe
ManipulaAtributo
exige um
construtor para a instanciação de objetos referentes a essa classe. Outra semelhança com a
classe citada é a utilização do mesmo construtor e os mesmos nomes de grande parte dos
métodos; embora as implementações sejam diferentes, a idéia central é a mesma. Ambas as
classes são instanciadas com os elementos que compõem o esquema principal. As seções
subseqüentes apresentam os principais métodos dessa classe.
4.5.8.1 Método nomeIgual(String elem,String nome)
O método
nomeIgual(String,
String)
da classe ManipulaAtributo possui a
responsabilidade de informar uma possível existência de um determinado atributo
relacionado a um elemento. O primeiro parâmetro desse método informa o nome do
elemento que o atributo está relacionado. Esse procedimento torna-se necessário, pois é
67
possível que existam atributos com os mesmos nomes e relacionados a elementos
diferentes. O retorno desse método é true ou false dependendo da existência ou não do
atributo relacionado ao elemento informado.
4.5.8.2 Método nomeIgualTipoIgual(String elem,String nome, String Tipo)
A responsabilidade de informar a existência de atributos com nomes e tipos iguais
relacionados a elementos com o mesmo nome em ambos os esquemas é desse método. O
retorno desse método pode ser true ou false. A figura abaixo apresenta o código referente
oa método citado.
1
public boolean nomeIgualTipoIgual(String elemento,String nome,String tipo)
2
{
3
for(int i=0; i< ListaElementosAtributos.size(); i++)
4
{
5
if(ListaElementosAtributos.get(i).getClass().getName().equals(classe_atributos)
6
|| listaElementosAtributos.get(i).getClass().getName().equals(classe_atributos2))
7
{
8
Atributos As =(Atributos)ListaElementosAtributos.get(i);
9
List Atr = As.getAtributo();
10
for(int j=0; j<Atr.size(); j++)
11
{
12
Atributo A = (Atributo)Atr.get(j);
13
if(As.getElementoRef().equals(elemento) && A.getNome().equals(nome)
14
&& A.getTipo().equals(tipo))
15
return true;
16
}
17
}
18
}
19
return false;
20
}
Figura 28 – Código do método nomeIgualTipoIgual da classe ManipulaAtributo
As linhas 5 e 6 da figura 28 acima possuem a responsabilidade de verificar se o
elemento referente a cada posição da lista é um atributo. Quando uma determinada posição
da lista for um atributo, é realizada um associação entre um objeto da classe
Atributos
eo
item referente a uma determinada posição da lista. Atributos são formados por uma lista de
68
Atributo
e o mesmo processo é realizado (linhas 9,10, 11, 12). Essa rotina se repete até que
o elemento seja encontrado ou quando acabarem os itens da lista, retornando true ou false,
respectivamente.
4.5.8.3 Método integraNomeIgualTipoIgual(String elem,Atributo A)
O método
integraNomeIgualTipoIgual(String, Atributo)
é responsável pela integração
dos atributos que possuem nomes e tipos iguais e estão relacionados a elementos com os
mesmos nomes em ambos os esquemas. O primeiro parâmetro desse método armazena o
nome do elemento que está relacionado ao atributo e o segundo parâmetro contém as
informações referente ao atributo.
A utilização desse método torna-se necessária quando existem atributos com
informações distintas em ambos os esquemas mas que estão relacionados a elementos com
os mesmos nomes, possuindo nomes e tipos iguais. Atributos com diferentes padrões de
declarações (REQUIRED, IMPLIED) podem ser enquadrados nesse contexto.
1
2
Esquema principal
<!ATTLIST data dia
CDATA #REQUIRED>
Esquema secundário
<!ATTLIST data dia
CDATA #IMPLIED>
Figura 29 – Exemplo de atributos com padrões de declarações diferentes
Atributos do tipo enumerado e do tipo notação também podem ser enquadrados no
contexto acima. É possível que atributos do tipo enumerado ou notação possuam
argumentos diferentes. O processo de integração utilizado pela ferramenta PINAJÉ prevê
essa situação, integrando no esquema principal os atributos de ambos os esquemas.
Resumidamente, é feito uma varredura nos atributos de ambos os esquemas, acrescentando
no atributo referente ao esquema principal os argumentos que só existem no atributo
referente ao esquema secundário.
69
4.5.8.4 Método integraNomeIgualTipoDiferente(String elem,Atributo A)
Para a integração de atributos com nomes iguais e tipos diferentes foi definida uma
única regra. Baseando-se nos tipos de atributos de uma DTD, que se resumem em apenas
dez tipos distintos, e na dificuldade da realização de uma integração de atributos distintos,
optou-se por padronizar aintegração de todos os atributos com nomes iguais e tipos
diferentes. Como exemplo da dificuldade encontrada pode-se citar a integração de dois
atributos: um do tipo
NOTATION.
ID
e outro do tipo
IDREF
ou ainda um atributo
FIXED
e outro do tipo
Em todos as ocorrências de atributos com as caracteristicas citadas
anteriormente, terá como resultado um atributo do tipo
CDATA
e
IMPLIED.
A figura abaixo
exemplifica parte do código referente ao método integraNomeIgualTipoDiferente(...).
1
public void integraNomeIgualTipoDiferente(String elementoRef,Atributo a)
2
{
3
...
4
Atributos As =(Atributos)ListaElementosAtributos.get(i);
5
List Atr = As.getAtributo();
6
for(int j=0; j<Atr.size(); j++)
7
{
8
9
Atributo A = (Atributo)Atr.get(j);
if(As.getElementoRef().equals(elementoRef) && A.getNome().equals(a.getNome()))
10
{
11
A.setTipo("CDATA");
12
A.setPadrao("IMPLIED");
13
A.setAttribValue(null);
14
15
...
}
Figura 30 – Parte do código do método
integraNomeIgualTipoDiferente
da classe
ManipulaAtributo
Como foi mencionado anteriormente, esse método apenas modifica o atributo
desejado tornando-o bastante amplo. Uma restrição maior poderá ser introduzida pelo
usuário após a realização do processo de integração da ferramenta PINAJÉ.
70
4.5.8.5 Método insereAtributo(Atributo A, String elemento)
Assim como ocorreu a necessidade de inserir novos elementos para a realização da
integração entre os elementos, o mesmo ocorre quando deseja-se integrar atributos, pois as
chances de existirem atributos com nomes distintos referentes a um mesmo elemento não
devem ser desconsideradas.
O primeiro parâmetro desse método é o atributo desejado para a inserção; o
segundo parâmetro informa o elemento que o atributo está relacionado. O primeiro passo
do processo de inserção de um atributo é a verificação da existência de mais atributos
relacionados ao elemento especificado. Confirmando a existência, a inserção é realizada na
lista de todos os atributos referentes ao elemento informado. Caso não exista nenhum
atributo relacionado ao elemento, é criado um novo objeto da classe
Atributos;
insere o
atributo na lista desse objeto e insere o conteúdo do objeto no esquema principal. A figura
31 exemplifica parte do código desse método.
1
public void insereAtributo(Atributo a,String elemento){
2
boolean existe = false;
3
...
4
Atributos As =(Atributos)ListaElementosAtributos.get(i);
5
if(As.getElementoRef().equals(elemento))
6
{
7
As.getAtributo().add(a);
8
existe = true;
9
}
10
...
11
If(!existe){
12
...
13
Atributos AS = ClasseNovo.novoAtributos(elemento);
14
AS.getAtributo().add(a);
15
ListaElementosAtributos.add(AS);
16
17
…
}
Figura 31 – Parte do código do método insereAtributo(...)
A variável “booleana” existe é utilizada para informar se foi encontrado pelo menos
um atributo relacionado ao elemento que foi passado como parâmetro. Quando não é
71
encontrado nenhum atributo relacionado ao elemento informado, o atributo é inserido no
esquema principal como único atributo do elemento informado.
72
5. CONSIDERAÇÕES FINAIS
A alta heterogeneidade que envolve grande parte dos documentos XML dificulta
seu tratamento eficiente. Consultas, atualizações, remoções e inserções podem ser tarefas
desgastantes quando a fonte acessada não apresenta uma estrutura regular. Para tanto, o
tratamento de documentos semi-estruturados é normalmente realizado com base em um
esquema relacionado à fonte desejada. As informações contidas nesse esquema ajudam a
minimizar o impacto da alta heterogeneidade desses documentos.
Contudo, a heterogeneidade dos documentos também é refletida em seus esquemas.
É comum a existência de esquemas diferentes relacionados a um mesmo domínio de
aplicação. A flexibilidade e subjetividade, características dos documentos XML, muitas
vezes também são herdadas pelos seus esquemas. A existência de um esquema único,
global, suficientemente capaz de suportar todas as alternativas possíveis para todos os
documentos referentes a um mesmo domínio de aplicação, solucionaria o problema
mencionado. A integração dos esquemas existentes pode ser uma alternativa viável para a
geração de um esquema global.
Uma alternativa para a integração de esquemas para documentos semi-estruturados
é apresentada nesse trabalho. Esse processo de integração tenta unir todas as informações
contidas em cada esquema a ser integrado em um único esquema geral. No entanto, os
esquemas menos restritos prevalecem sobre os demais e pode muitas vezes omitir as
informações contidas em esquemas mais rígidos.
Apesar do processo de integração de esquemas XML utilizado nesse trabalho ser
inteiramente sintático, não considerando a semântica dos dados contidos nos documentos,
a ferramenta desenvolvida pode ser uma solução para a problemática da integração de
esquemas semi-estruturados representados através da utilização de DTD’s. O problema
semântico pode ser resolvido pela aplicação, que se beneficiará do esquema integrado,
73
juntamente com auxílio de um especialista de domínio, visto que a mesma informação
pode estar disponibilizada diferentemente.
Como trabalho futuro, pretende-se realizar a integração de outros tipos de esquemas
XML. Esquemas representados pela linguagem XML Schema disponibilizam normalmente
mais informações que as DTD’s. Assim como as DTD’s, os documentos XML Schema
possuem uma seqüência lógica que pode ser prevista por outro esquema. A própria W3C
disponibiliza um esquema geral dessa linguagem. No entanto, a integração desses
esquemas requer mais detalhamento que o utilizado pela proposta. A possibilidade da
utilização de namespaces e as diversas alternativas de representação de uma mesma
informação são fatores relevantes e que deverão ser levados em consideração. Uma
integração semântica e semi-automática torna-se interessante.
74
6. REFERÊNCIAS BIBLIOGRÁFICAS
(ANDERSON, 2001)
ANDERSON, R. et al. Professional XML. Rio de Janeiro:
Ciência Moderna LTDA., 2001.
(AHO et al 1995)
AHO, Alred V., SETHI Ravi, ULLMAN, Jeffrey D.,
Compiladores Principios, Técnicas e Ferramentas,
Tradução Daniel de Ariosto Pinto, Editora: Afiliada, Rio
de Janeiro, RJ 1995.
(ARMSTRONG, 2003)
ARMSTRONG, E. et al. Java Web Services Tutorial.
Disponível
em
http://java.sun.com/webservices/docs/1.3/tutorial/doc/inde
x.html. Acesso em 10/09/2003
(BARTINI, 1986)
BARTINI, C; LANZERINI, M; NAVATHE, S. B. A
comparative analysis of methodologies for database
schema integration. ACM Press, New York, NY, USA,
December 1986.
(CASTANO, 2001)
CASTANO, S.; ANTONELLIS, V.; VIMERCATI, S. C.
Global Viewing of Heterogeneous Data Sources. on
Knowledge and Data Engineering, 2000. Disponível em
http://192.167.20.141/webdb/interdata_tema3/Artemis/arti
cles.html. Acesso em 05/11/03.
(DAUM, 2002)
DAUM, Berthold; MERTEN, Udo. Arquitetura de
Sistemas com XML. Rio de Janeiro: Campus, 2002. 440p
(DTDGenerator, 2003)
DTDGenerator. A tool to generate XML DTds. Version
7.0.
Disponível
na
internet
em
75
http://saxon.sourceforge.net/dtdgen.html.
Acesso
05/11/2003
(DTDParser, 2003)
DTDParser, JavaCC Grammar Repository. Disponível
em:http://www.cobase.cs.ucla.edu/pub/javacc/DTDParser.j
j. Acessado em 08/10/2003.
(GOLDMAN, 2000)
GOLDMAN,
Roy;
Widom,
Jennifer.
DataGuides:
Enabling Query Formulation and Optimization in
Semistructured
Databases.
Disponível
em
<http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?
lang=en&doc=1997-50&format=pdf&compression=>
Acesso em 22/04/2003.
(ISO, 2003)
ISO. International Organization for Standardization.
Disponível em http://www.iso.ch. Acesso 03/11/2003
(LORE, 2003)
LORE, Database. Stanford: Universidade de Stanford.
Disponível em <http://www-db.stanford.edu/lore/> Acesso
em 02/06/2003.
(MARCHAL, 2000)
MARCHAL, Benoit. XML conceitos e aplicações. São
Paulo: Berkeley, 2000. 547p.
(McGRATH, 1999)
McGRATH, Sean. XML Aplicações práticas. Rio de
Janeiro: Campus, 1999. 367p.
(McHUGH, 1997)
McHUGH,
QUASS,
J.;
D.;
Management
ABITEBOUL
S.;
WIDOM,
Lore:
System
J..
for
GOLDMAN,
A
R.;
Database
Semistructured
Data.
SIGMOD Record, 26(3): 54-66 (1997).
(MELLO, 2002)
MELLO, R. S. Uma Abordagem Bottom- Up para a
Integração Semântica de Esquemas XML. Tese
(Doutorado), Programa de pos-graduação em Computação.
Universidade Federal do Rio Grande do Sul, Porto
76
Alegre.145p.
(MELO, 2000)
MELO, Ronaldo dos Santos. Aplicação de Ontologias a
Bancos de Dados Semi-Estruturados. Exame de
Qualificação (Pós-Graduação em Computação) 2000.
Instituto de Informática da Universidade Federal do Rio
Grande do Sul. Universidade Federal do Rio Grande do
Sul, Porto Alegre.150 p.
(PAPAKONSTANTINOU,1995) PAPAKONSTANTINOU, Y; GARCIA-MOLINA, H;
WIDOM, J. Object Exchange Across Heterogeneous
Information Sources. International Conference on Data
Engineering, Taipei, Taiwan, 1995.
(RAHM, 2001)
RAHM, E;BERNSTEIN, P; PHILIP, A. On Matching
Schemas Automatically. Disponível em http://dol.unileipzig.de/pub/2001-5. Acesso 03/11/2003
(SHETH, 1990)
SHETH, A. P; LARSON, J, A. Federal Database System
for
Managing
Automomous
Distributed,
Heterogeneos,
and
Disponível
em
Databases.
http://lsdis.cs.uga.edu/lib/download/SL90.pdf.
Acesso
03/11/2003.
(SOFTWARE AG, 1999)
SOFTWARE
Documentation
AG.
Introducing
Overview.
Tamino.
Tamino
Disponível
em
<http://www.cs.uni-essen.de/dawis
/teaching/ss2000/nsdb/tamino/help/concepts/cfintro.htm>.
Acesso em 20/06/2003
(SOFTWARE AG, 2003)
SOFTWARE AG, Tamino XML Server . Disponível em
<http://www.softwareag.com/tamino/>.
Acesso
em
23/04/2003
(TAMINO, 2002)
TAMINO DOCUMENTATION. Tamino XML Server
Version 3.1.1. abril 2002
(W3C CONSORTIUM, 2003)
W3C CONSORTIUM. XML Schema Part 0: Primer.
77
W3C Recommendation 02 may 2001. Disponível em <
http://www.w3.org/TR/xmlschema-2/
>
Acesso
em
Integration
of
11/03/2003
(WIEDERHOLD, 1993)
WIEDERHOLD,
G.
Inteligent
Information. ACM-SIGMOD, Washington DC, May
1993.
(XML, 2003)
WORLD WIDE WEB CONSORTIUM. Extensible
Markup
Language
(XML).
Disponível
<http://www.w3.org/XML/>. Acesso em 12/05/2003.
em
78
ANEXOS
79
DOCUMENTO 1: Documento XML referente ao domínio de monografias
<?xml version="1.0" encoding="ISO-8859-1"?>
<monografia>
<capa>
<logomarca>CEULP / ULBRA</logomarca>
<instituicao>Centro Universitario Luterano de Palmas</instituicao>
<titulo>DTD</titulo>
<autor>Marcus Pinto</autor>
<local>Palmas</local>
<ano>2003</ano>
</capa>
<contracapa>
<logomarca>CEULP / ULBRA</logomarca>
<instituicao>Centro Universitario Luterano de Palmas</instituicao>
<titulo>DTD</titulo>
<autor>Marcus Pinto</autor>
<orientador>Deise de Brum</orientador>
<local>Palmas</local>
<ano>2003</ano>
</contracapa>
<agradecimento>Agradeco...</agradecimento>
<sumario numero= "1" pag= "8">
<titulo>Introducao</titulo>
</sumario>
<sumario numero= "2" pag= "9">
<titulo>Revisao de Literatura</titulo>
</sumario>
<listadefiguras>
<figura numero="1" pagina="15">nome da figura#1</figura>
<figura numero="2" pagina="25">nome da figura#2</figura>
</listadefiguras>
<listadetabelas>
<tabela numero="1" pagina="20">nome da tabela#1</tabela>
<tabela numero="2" pagina="30">nome da tabela#2</tabela>
</listadetabelas>
<resumo>
<textoResumo>este eh o resumo</textoResumo>
<palavraChave>palavra#1</palavraChave>
<palavraChave>palavra#2</palavraChave>
</resumo>
<abstract>
80
<textoAbstract>este eh o resumo</textoAbstract>
<keyword>palavra#1</keyword>
<keyword>palavra#2</keyword>
</abstract>
<corpo>
<capitulo numero="1" pagina="8" titulo="Introducao">
<paragrafo>primasdh
sbfjh
sbghbasfbgkf
gihouhfgoiuahr
iughpia
drgoiuahv airgius guygsou</paragrafo>
<secao numero="1" pagina="8" titulo="subIntroducao">
<paragrafo>ajsgjfasgdjfgasdgh</paragrafo>
<figuraCorpo
number="1"
pag="15">nome
da
figura
da
figura
#1</figuraCorpo>
<paragrafo>ajsgjfasgdjfgasdgh</paragrafo>
</secao>
</capitulo>
<capitulo numero="2" pagina="9" titulo="Revisao de Literatura">
<paragrafo>jhsg djgsdgjsgjd</paragrafo>
<secao numero="3" pagina="10" titulo="secaoTeste">
<paragrafo>jhsg djgsdgjsgjd</paragrafo>
<figuraCorpo
number="2"
pag="25">nome
#2</figuraCorpo>
</secao>
</capitulo>
<capitulo numero="3" pagina="20" titulo="Materiais e Metodos">
<paragrafo>jhsg djgsdgjsgjd</paragrafo>
<lista>
<item>item#1</item>
<item>item#2</item>
<item>item#3</item>
</lista>
<paragrafo>jhsg djgsdgjsgjd</paragrafo>
</capitulo>
</corpo>
<referencias>texto</referencias>
<anexos>texto</anexos>
</monografia>
81
DOCUMENTO 2: Documento XML referente ao domínio de monografias
<?xml version="1.0"?>
<monografia>
<capa>
<identificacao>
<logomarca> CEULP / ULBRA </logomarca>
<nomeinstituicao>
Centro
Universitario
Luterano
de
Luterano
de
Palmas</nomeinstituicao>
<titulo> SGML </titulo>
<autor>Pollyane Lustosa</autor>
<local>Palmas</local>
<ano>2003</ano>
</identificacao>
</capa>
<contracapa>
<identificacao>
<logomarca> CEULP / ULBRA </logomarca>
<nomeinstituicao>
Centro
Universitario
Palmas</nomeinstituicao>
<titulo> SGML </titulo>
<autor>Pollyane Lustosa</autor>
<local>Palmas></local>
<ano>2003</ano>
</identificacao>
<texto> Trabalho para Topicos II</texto>
</contracapa>
<resumo>O trabalho e interessante...</resumo>
<abstract>The work is interessant...</abstract>
<listatabelas>
<itemtabela> Tabela 1 - Blabla</itemtabela>
<itemtabela> Tabela 2 - Bleble</itemtabela>
</listatabelas>
<listafiguras>
<itemfigura> Figura 1 - Blabla</itemfigura>
<itemfigura> Figura 2 - Bleble</itemfigura>
</listafiguras>
<sumario>
<item>Introducao</item>
<item>Desenvolvimento</item>
<item>Conclusao</item>
<subitem> SGML </subitem>
82
<subitem> HTML </subitem>
</sumario>
<corpomonografia>
<secao>
<titulo>Introducao</titulo>
<corpo>
<paragrafo>
<texto> amdlsokokspfkdo</texto>
<citacaodireta>
<autor> Maria </autor>
<ano> 2000 </ano>
</citacaodireta>
</paragrafo>
<figura>Figura 1</figura>
<paragrafo>
<texto> amdlsokokspfkdo</texto>
<citacaodireta>
<autor> Maria </autor>
<ano> 2000 </ano>
</citacaodireta>
</paragrafo>
</corpo>
</secao>
<secao>
<titulo>Desenvolvimento</titulo>
<corpo>
<paragrafo>
<texto> amdlsokokspfkdo</texto>
<citacaodireta>
<autor> Maria </autor>
<ano> 2000 </ano>
</citacaodireta>
</paragrafo>
</corpo>
<subsecao1>
<titulo>Linguagens de Marcacao</titulo>
<corpo>
<paragrafo>
<texto> amdlsokokspfkdo</texto>
<citacaodireta>
<autor> Maria </autor>
<ano> 2000 </ano>
83
</citacaodireta>
</paragrafo>
</corpo>
<subsecao2>
<titulo>SGML</titulo>
<corpo>
<paragrafo>
<texto> amdlsokokspfkdo</texto>
<citacaodireta>
<autor> Maria </autor>
<ano> 2000 </ano>
</citacaodireta>
</paragrafo>
</corpo>
</subsecao2>
<subsecao2>
<titulo>HTML</titulo>
<corpo>
<paragrafo>
<texto> amdlsokokspfkdo</texto>
<citacaodireta>
<autor> Maria </autor>
<ano> 2000 </ano>
</citacaodireta>
</paragrafo>
</corpo>
</subsecao2>
</subsecao1>
</secao>
</corpomonografia>
<referenciabibliografica>
<titulo> a vida </titulo>
<cidade> palmas </cidade>
<editora> atica </editora>
<ano> 2000 </ano>
</referenciabibliografica>
<anexo>
blaldlfadoaodgldla
</anexo>
</monografia>
84
DTD 1 : DTD gerada automaticamente pela ferramenta DTDGenerator com base no
DOCUMENTO 1
<!ELEMENT abstract ( textoAbstract, keyword+ ) >
<!ELEMENT agradecimento ( #PCDATA ) >
<!ELEMENT anexos ( #PCDATA ) >
<!ELEMENT ano ( #PCDATA ) >
<!ELEMENT autor ( #PCDATA ) >
<!ELEMENT capa ( logomarca, instituicao, titulo, autor, local, ano ) >
<!ELEMENT capitulo ( lista | paragrafo | secao )+ >
<!ATTLIST capitulo numero NMTOKEN #REQUIRED >
<!ATTLIST capitulo pagina NMTOKEN #REQUIRED >
<!ATTLIST capitulo titulo CDATA #REQUIRED >
<!ELEMENT contracapa ( logomarca, instituicao, titulo, autor, orientador, local, ano ) >
<!ELEMENT corpo ( capitulo+ ) >
<!ELEMENT figura ( #PCDATA ) >
<!ATTLIST figura numero NMTOKEN #REQUIRED >
<!ATTLIST figura pagina NMTOKEN #REQUIRED >
<!ELEMENT figuraCorpo ( #PCDATA ) >
<!ATTLIST figuraCorpo number NMTOKEN #REQUIRED >
<!ATTLIST figuraCorpo pag NMTOKEN #REQUIRED >
<!ELEMENT instituicao ( #PCDATA ) >
<!ELEMENT item ( #PCDATA ) >
<!ELEMENT keyword ( #PCDATA ) >
<!ELEMENT lista ( item+ ) >
<!ELEMENT listadefiguras ( figura+ ) >
<!ELEMENT listadetabelas ( tabela+ ) >
<!ELEMENT local ( #PCDATA ) >
<!ELEMENT logomarca ( #PCDATA ) >
<!ELEMENT
monografia
(
capa,
contracapa,
agradecimento,
listadetabelas, resumo, abstract, corpo, referencias, anexos ) >
<!ELEMENT orientador ( #PCDATA ) >
<!ELEMENT palavraChave ( #PCDATA ) >
<!ELEMENT paragrafo ( #PCDATA ) >
<!ELEMENT referencias ( #PCDATA ) >
<!ELEMENT resumo ( textoResumo, palavraChave+ ) >
<!ELEMENT secao ( figuraCorpo | paragrafo | subsecao )+ >
<!ATTLIST secao numero NMTOKEN #REQUIRED >
<!ATTLIST secao pagina NMTOKEN #REQUIRED >
<!ATTLIST secao titulo NMTOKEN #REQUIRED >
<!ELEMENT subsecao EMPTY >
sumario+,
listadefiguras,
85
<!ELEMENT sumario ( titulo ) >
<!ATTLIST sumario numero NMTOKEN #REQUIRED >
<!ATTLIST sumario pag NMTOKEN #REQUIRED >
<!ELEMENT tabela ( #PCDATA ) >
<!ATTLIST tabela numero NMTOKEN #REQUIRED >
<!ATTLIST tabela pagina NMTOKEN #REQUIRED >
<!ELEMENT textoAbstract ( #PCDATA ) >
<!ELEMENT textoResumo ( #PCDATA ) >
<!ELEMENT titulo ( #PCDATA ) >
86
DTD 2 : DTD gerada automaticamente pela ferramenta DTDGenerator com base no
DOCUMENTO 2
<!ELEMENT abstract ( #PCDATA ) >
<!ELEMENT anexo ( #PCDATA ) >
<!ELEMENT ano ( #PCDATA ) >
<!ELEMENT autor ( #PCDATA ) >
<!ELEMENT capa ( identificacao ) >
<!ELEMENT cidade ( #PCDATA ) >
<!ELEMENT citacaodireta ( autor, ano ) >
<!ELEMENT contracapa ( identificacao, texto ) >
<!ELEMENT corpo ( figura | paragrafo )+ >
<!ELEMENT corpomonografia ( secao+ ) >
<!ELEMENT editora ( #PCDATA ) >
<!ELEMENT figura ( #PCDATA ) >
<!ELEMENT identificacao ( logomarca, nomeinstituicao, titulo, autor, local, ano ) >
<!ELEMENT item ( #PCDATA ) >
<!ELEMENT itemfigura ( #PCDATA ) >
<!ELEMENT itemtabela ( #PCDATA ) >
<!ELEMENT listafiguras ( itemfigura+ ) >
<!ELEMENT listatabelas ( itemtabela+ ) >
<!ELEMENT local ( #PCDATA ) >
<!ELEMENT logomarca ( #PCDATA ) >
<!ELEMENT monografia ( capa, contracapa, resumo, abstract, listatabelas, listafiguras, sumario,
corpomonografia, referenciabibliografica, anexo ) >
<!ELEMENT nomeinstituicao ( #PCDATA ) >
<!ELEMENT paragrafo ( texto, citacaodireta ) >
<!ELEMENT referenciabibliografica ( titulo, cidade, editora, ano ) >
<!ELEMENT resumo ( #PCDATA ) >
<!ELEMENT secao ( titulo, corpo, subsecao1? ) >
<!ELEMENT subitem ( #PCDATA ) >
<!ELEMENT subsecao1 ( titulo, corpo, subsecao2+ ) >
<!ELEMENT subsecao2 ( titulo, corpo ) >
<!ELEMENT sumario ( item+, subitem+ ) >
<!ELEMENT texto ( #PCDATA ) >
<!ELEMENT titulo ( #PCDATA ) >
87
DOC 1: DTD 1 representada através da linguagem XML com a utilização da ferramenta
DTDParser alterada
<raiz>
<elemento>
<pai>
<filho>
<nome>textoAbstract</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<mod>+</mod>
<nome>keyword</nome>
</filho>
<nome>abstract</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>agradecimento</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>anexos</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>ano</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>autor</nome>
</pai>
</elemento>
88
<elemento>
<pai>
<filho>
<nome>logomarca</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>instituicao</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>autor</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>local</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>ano</nome>
</filho>
<nome>capa</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>lista</nome>
</filho>
<delimitador>|</delimitador>
<filho>
<nome>paragrafo</nome>
</filho>
<delimitador>|</delimitador>
<filho>
<nome>secao</nome>
</filho>
<mod>+</mod>
89
<nome>capitulo</nome>
</pai>
</elemento>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>numero</nome>
</atributo>
<elementoRef>capitulo</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>pagina</nome>
</atributo>
<elementoRef>capitulo</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>CDATA</tipo>
<padrao>REQUIRED</padrao>
<nome>titulo</nome>
</atributo>
<elementoRef>capitulo</elementoRef>
</atributos>
<elemento>
<pai>
<filho>
<nome>logomarca</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>instituicao</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
90
<nome>autor</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>orientador</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>local</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>ano</nome>
</filho>
<nome>contracapa</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>capitulo</nome>
</filho>
<nome>corpo</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>figura</nome>
</pai>
</elemento>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>numero</nome>
</atributo>
<elementoRef>figura</elementoRef>
</atributos>
<atributos>
<atributo>
91
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>pagina</nome>
</atributo>
<elementoRef>figura</elementoRef>
</atributos>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>figuraCorpo</nome>
</pai>
</elemento>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>number</nome>
</atributo>
<elementoRef>figuraCorpo</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>pag</nome>
</atributo>
<elementoRef>figuraCorpo</elementoRef>
</atributos>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>instituicao</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>item</nome>
</pai>
</elemento>
<elemento>
<pai>
92
<tipo>PCDATA</tipo>
<nome>keyword</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>item</nome>
</filho>
<nome>lista</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>figura</nome>
</filho>
<nome>listadefiguras</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>tabela</nome>
</filho>
<nome>listadetabelas</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>local</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>logomarca</nome>
</pai>
93
</elemento>
<elemento>
<pai>
<filho>
<nome>capa</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>contracapa</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>agradecimento</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<mod>+</mod>
<nome>sumario</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>listadefiguras</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>listadetabelas</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>resumo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>abstract</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>corpo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>referencias</nome>
94
</filho>
<delimitador>,</delimitador>
<filho>
<nome>anexos</nome>
</filho>
<nome>monografia</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>orientador</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>palavraChave</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>paragrafo</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>referencias</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>textoResumo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<mod>+</mod>
<nome>palavraChave</nome>
</filho>
95
<nome>resumo</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>figuraCorpo</nome>
</filho>
<delimitador>|</delimitador>
<filho>
<nome>paragrafo</nome>
</filho>
<delimitador>|</delimitador>
<filho>
<nome>subsecao</nome>
</filho>
<mod>+</mod>
<nome>secao</nome>
</pai>
</elemento>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>numero</nome>
</atributo>
<elementoRef>secao</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>pagina</nome>
</atributo>
<elementoRef>secao</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>titulo</nome>
</atributo>
96
<elementoRef>secao</elementoRef>
</atributos>
<elemento>
<pai>
<tipo>EMPTY</tipo>
<nome>subsecao</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>titulo</nome>
</filho>
<nome>sumario</nome>
</pai>
</elemento>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>numero</nome>
</atributo>
<elementoRef>sumario</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>pag</nome>
</atributo>
<elementoRef>sumario</elementoRef>
</atributos>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>tabela</nome>
</pai>
</elemento>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
97
<nome>numero</nome>
</atributo>
<elementoRef>tabela</elementoRef>
</atributos>
<atributos>
<atributo>
<tipo>NMTOKEN</tipo>
<padrao>REQUIRED</padrao>
<nome>pagina</nome>
</atributo>
<elementoRef>tabela</elementoRef>
</atributos>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>textoAbstract</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>textoResumo</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>titulo</nome>
</pai>
</elemento>
</raiz>
98
DOC 2: DTD 2 representada através da linguagem XML com a utilização da ferramenta
DTDParser alterada.
<raiz>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>abstract</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>anexo</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>ano</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>autor</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>identificacao</nome>
</filho>
<nome>capa</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>cidade</nome>
</pai>
99
</elemento>
<elemento>
<pai>
<filho>
<nome>autor</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>ano</nome>
</filho>
<nome>citacaodireta</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>identificacao</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>texto</nome>
</filho>
<nome>contracapa</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>figura</nome>
</filho>
<delimitador>|</delimitador>
<filho>
<nome>paragrafo</nome>
</filho>
<mod>+</mod>
<nome>corpo</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
100
<nome>secao</nome>
</filho>
<nome>corpomonografia</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>editora</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>figura</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>logomarca</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>nomeinstituicao</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>autor</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>local</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>ano</nome>
</filho>
101
<nome>identificacao</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>item</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>itemfigura</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>itemtabela</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>itemfigura</nome>
</filho>
<nome>listafiguras</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>itemtabela</nome>
</filho>
<nome>listatabelas</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
102
<nome>local</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>logomarca</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>capa</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>contracapa</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>resumo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>abstract</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>listatabelas</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>listafiguras</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>sumario</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>corpomonografia</nome>
</filho>
103
<delimitador>,</delimitador>
<filho>
<nome>referenciabibliografica</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>anexo</nome>
</filho>
<nome>monografia</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>nomeinstituicao</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>texto</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>citacaodireta</nome>
</filho>
<nome>paragrafo</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>cidade</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>editora</nome>
</filho>
104
<delimitador>,</delimitador>
<filho>
<nome>ano</nome>
</filho>
<nome>referenciabibliografica</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>resumo</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>corpo</nome>
</filho>
<delimitador>,</delim tador>
<filho>
<mod>?</mod>
<nome>subsecao1</nome>
</filho>
<nome>secao</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>subitem</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
105
<filho>
<nome>corpo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<mod>+</mod>
<nome>subsecao2</nome>
</filho>
<nome>subsecao1</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<nome>titulo</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<nome>corpo</nome>
</filho>
<nome>subsecao2</nome>
</pai>
</elemento>
<elemento>
<pai>
<filho>
<mod>+</mod>
<nome>item</nome>
</filho>
<delimitador>,</delimitador>
<filho>
<mod>+</mod>
<nome>subitem</nome>
</filho>
<nome>sumario</nome>
</pai>
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>texto</nome>
</pai>
106
</elemento>
<elemento>
<pai>
<tipo>PCDATA</tipo>
<nome>titulo</nome>
</pai>
</elemento>
</raiz>
107
DTD resultante : DTD integrada resultante das integração das DTD’s (DTD 1 e DTD 2)
<!ELEMENT abstract ( #PCDATA | textoAbstract | keyword)*>
<!ELEMENT agradecimento ( #PCDATA ) >
<!ELEMENT anexos ( #PCDATA ) >
<!ELEMENT ano ( #PCDATA ) >
<!ELEMENT autor ( #PCDATA ) >
<!ELEMENT capa ( logomarca | instituicao | titulo | autor | local | ano | identificacao )* >
<!ELEMENT capitulo ( lista | paragrafo | secao )+ >
<!ATTLIST capitulo numero
<!ATTLIST capitulo pagina
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
<!ATTLIST capitulo titulo
CDATA #REQUIRED >
<!ELEMENT contracapa (
logomarca | instituicao | titulo | autor | orientador | local | ano |
identificacao | texto )* >
<!ELEMENT corpo ( capitulo | figura | paragrafo )* >
<!ELEMENT figura ( #PCDATA ) >
<!ATTLIST figura numero
<!ATTLIST figura pagina
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
<!ELEMENT figuraCorpo ( #PCDATA ) >
<!ATTLIST figuraCorpo number
<!ATTLIST figuraCorpo pag
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
<!ELEMENT instituicao ( #PCDATA ) >
<!ELEMENT item ( #PCDATA ) >
<!ELEMENT keyword ( #PCDATA ) >
<!ELEMENT lista ( item+ ) >
<!ELEMENT listadefiguras ( figura+ ) >
<!ELEMENT listadetabelas ( tabela+ ) >
<!ELEMENT local ( #PCDATA ) >
<!ELEMENT logomarca ( #PCDATA ) >
<!ELEMENT monografia (
capa | contracapa | agradecimento | sumario | listadefiguras |
listadetabelas | resumo | abstract | corpo | referencias | anexos | listatabelas | listafiguras |
corpomonografia | referenciabibliografica | anexo )* >
<!ELEMENT orientador ( #PCDATA ) >
<!ELEMENT palavraChave ( #PCDATA ) >
<!ELEMENT paragrafo ( #PCDATA | texto | citacaodireta)*>
<!ELEMENT referencias ( #PCDATA ) >
<!ELEMENT resumo ( #PCDATA | textoResumo | palavraChave)*>
<!ELEMENT secao ( figuraCorpo | paragrafo | subsecao | titulo | corpo | subsecao1 )* >
<!ATTLIST secao numero
<!ATTLIST secao pagina
<!ATTLIST secao titulo
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
108
<!ELEMENT subsecao ( EMPTY ) >
<!ELEMENT sumario ( titulo | item | subitem )* >
<!ATTLIST sumario numero
<!ATTLIST sumario pag
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
<!ELEMENT tabela ( #PCDATA ) >
<!ATTLIST tabela numero
<!ATTLIST tabela pagina
NMTOKEN #REQUIRED >
NMTOKEN #REQUIRED >
<!ELEMENT textoAbstract ( #PCDATA ) >
<!ELEMENT textoResumo ( #PCDATA ) >
<!ELEMENT titulo ( #PCDATA ) >
<!ELEMENT anexo ( #PCDATA ) >
<!ELEMENT cidade ( #PCDATA ) >
<!ELEMENT citacaodireta ( autor , ano ) >
<!ELEMENT corpomonografia ( secao+ ) >
<!ELEMENT editora ( #PCDATA ) >
<!ELEMENT identificacao ( logomarca , nomeinstituicao , titulo , autor , local , ano ) >
<!ELEMENT itemfigura ( #PCDATA ) >
<!ELEMENT itemtabela ( #PCDATA ) >
<!ELEMENT listafiguras ( itemfigura+ ) >
<!ELEMENT listatabelas ( itemtabela+ ) >
<!ELEMENT nomeinstituicao ( #PCDATA ) >
<!ELEMENT referenciabibliografica ( titulo , cidade , editora , ano ) >
<!ELEMENT subitem ( #PCDATA ) >
<!ELEMENT subsecao1 ( titulo , corpo , subsecao2+ ) >
<!ELEMENT subsecao2 ( titulo , corpo ) >
<!ELEMENT texto ( #PCDATA ) >
Download

MARCUS BARBOSA PINTO UMA PROPOSTA PARA