XML - Usando DTD - Document Type Definition
Lá pelos idos da virada do milênio , há muiiiitooo tempo atrás , no ano de 2000 eu publiquei o primeiro artigo sobre XML. Se quiser ler o artigo acesso o link:XML - eXtensible Markup Language - Introdução
Muita coisa mudou desde então mas o XML realmente se tornou um padrão do mercado. Agora as pesquisas estão se direcionando para o intercâmbio de informações entre as diferentes plataformas e aplicativos. Mas isto é outro assunto...
Vou falar um pouco mais sobre XML .
A XML - eXtensible Markup Language - foi definida pelo comite W3C - World Wide Web Consortium (www.w3.org) com os seguintes objetivos:
descrever dados , dando semântica a unidade de informação
Trocar dados na internet ou qualquer meio eletrônico (transferência eletrônica entre banco de dados,correio eletrônico, etc.)
armazenar e organizar documentos (armazenar o conteúdo de documentos em formato aberto)
descrever metadados de uma aplicação
A XML não surgiu por acaso e também não surgiu do nada. Suas origens estão no SGML - Standard Generalized Markup Language - que foi a primeira linguagem de marcação (pensou que fosse HTML ??)
Atualmente os componentes do padrão XML podem ser listados abaixo:
DTD - linguagem para definir a estrutura de um documento XML
Xpath - linguagem para referenciar partes de um documento
XSL.FO - linguagem para definir formatação de documentos
XSLT - linguagem para especificar transformações de XML para outros formatos texto (TXT, PDF, RTF , etc...)
XML/Schema - substitui com vantagens a DTD
XQuery - linguagem para escrever consultas em XML (SQL da XML)
APIs : SAX e DOM - interface para se comunicar com processadores XML
Um arquivo XMl contém texto e marcação XML. lembrando que as tags XML obedecem , rigorosamente , as seguintes regras:
Todas as tags devem ser fechadas => incorreto <mensagem>incorreto
As tags são case sensitive => incorreto <Mensagem>incorreto</mensagem>
As tags devem estar bem aninhadas => incorreto <t1><t2>incorreto</t1></t2>
Todo documento XML deve possuir uma raiz
Nota: Um documento construído de acordo com as regras gerais de XML é dito bem-formado(well-formed)
Exemplo de um livro em sintaxe XML no arquivo livro.xml abaixo:
<livro> <capitulo> <secao> <paragrafo>...</paragrafo> <paragrafo>...</paragrafo> </secao> <secao> <paragrafo>...</paragrafo> <paragrafo>...</paragrafo> </secao> </capitulo> </livro> |
Se
houver um elemento vazio podemos usar a notação abreviada. Abaixo o elemento professor esta vazio ; podemos neste caso abrir e fechar a tag. <pessoa> |
Outra forma seria
representar o elemento usando a notação padrão:
<pessoa> |
Usando atributos
Um elemento pode conter informação adicional sobre o seu conteúdo , para isto usamos os atributos. Vejamos o exemplo do livro agora com a utilização de atributos
<livro
isbn="86.340.0789-8"
versao="1"> <capitulo numero="2"> <secao id="1"> <paragrafo>...</paragrafo> <paragrafo>...</paragrafo> </secao> <secao> <paragrafo>...</paragrafo> <paragrafo>...</paragrafo> </secao> </capitulo> </livro> |
<livro> <isbn>86.340.0789-8"</isbn> <versao>1</versao> <capitulo> <numero>2</numero> <secao> <id>1</id> <paragrafo>...</paragrafo> <paragrafo>...</paragrafo> </secao> <secao> <paragrafo>...</paragrafo> <paragrafo>...</paragrafo> </secao> </capitulo> </livro> |
A versão de livro.xml com atributos | A versão sem atributos |
Algumas regras sobre atributos:
Um elemento pode conter um número arbitrário de atributos
O padrão XML possui alguns atributos reservados que começa sempre com xml:. Ex: xml:lang
Usando DTD - Document Type Definition
XML pode ter um esquema pré-definido a partir do qual as instâncias XML são construídas. Este esquema é o DTD.
o XML as regras que definem um documento são ditadas por DTDs (Document Type Definitions), elas ajudam a validar os dados quando a aplicação que os recebe não possui internamente uma descrição do dado que está recebendo. Os DTDs são opcionais e os dados enviados com um DTD são conhecidos como dados XML válidos.
Com os dados XML válidos e com os bem-formatados, o documento XML se torna auto-descritivo porque as tags dão idéia de conteúdo e estão misturadas com os dados. Como o formato do documento é aberto e flexível, ele pode ser usado em qualquer lugar onde a troca ou transferência de informação é necessária. Com isto , podemos usar o XML para descrever informações sobre páginas HTML, ou descrever dados contidos em objetos ou regras de negócios, ou transações eletrônicas comerciais, etc.
O DTD define um conjunto de regras que definem a estrutura do documento indicando os elementos que podem ser usados e onde podem ser aplicados . Assim ao construir um documento XML de acordo com sua DTD dizemos que ele é um documento válido.
O DTD pode ser definido como um subconjunto interno de um documento XML ou como um subconjunto externo.( um arquivo com extensão .dtd)
O que define formalmente quais elementos e quais combinações possíveis são permitidas dentro de um documento XML é o "schema". Existem novos esquemas propostos ao W3C, dentre eles estando o DCD (Document Content Description), que fornecem a mesma funcionalidade dos DTDs, e que, pelo fato de linguagens esquema serem extensíveis, os desenvolvedores podem aumentá-los com informações adicionais, tais como regras de apresentação, tornando essas novas linguagens esquema mais poderosas que os DTDs.
A estrutura básica da DTD é a seguinte :
Composta por declarações | <! ........> |
Definição de elemento | <!ELEMENT ...> |
Definição de atributos | <!ATTLIST .. .> |
Definição de entidades | <!ENTITY .... > |
Definição de novos tipos | <!NOTATION ...> |
Assim podemos ter :
1- Definição de novo elemento e especificação do conteúdo permitido para o arquivo livro.xml :
<!ELEMENT capitulo (titulo,secao)>
2- Um elemento pode ser vazio , não contendo elementos mas contendo atributos:
<!ELEMENT imagem EMPTY>
3- Elementos contendo todos os elementos declarados na DTD.
<!ELEMENT p ANY>
4- Quando um elemento é composto por texto:
<!ELEMENT titulo (#PCDATA)
Podemos utilizar os conectores de escolha.Os conectores são : "," ou "|":
1- Conector de sequência usa o conector "," (e) : Ex: <!ELEMENT capitulo (titulo,autor,secao)>
2- Conector de escolha usa o conector "|" (ou) . Ex: <!ELEMENT endereco (instituicao,cidade)>
3- Podemos misturar os dois conectores de escolha usando "()": Ex: <!ELEMENT time (Santos, (Palmeiras|Sao Paulo))>
Podemos também realizar um controle de quantidade para os elementos usando os símbolos "?" , "+" ou "*"; dependendo do caso podemos ter:
1- Elemento opcional sem repetição : "?"
Ex: <!ELEMENT autor (nome , sobrenome?)>
2- Elemento requerido e com repetição: "+"
Ex: <!ELEMENT autor (nome+)>
3- Elemento opcional e com repetição: "*"
Ex: <!ELEMENT teste (a*)>
Nota: para um tipo de dados texto usamos a notação CDATA.
Declarando atributos:
1- Atributos que devem estar presentes cada vez que o elemento é usado deve usar a palavra reservada #REQUIRED
Ex: <!ATTLIST autor codigo CDATA #REQUIRED>
2- Atributos que podem estar ausentes cada vez que o elemento é usado deve usar a palavra reservada #IMPLIED
Ex: <!ATTLIST autor email CDATA #IMPLIED>
3- Se o atributo possuir valores padrão usamos:
Ex: <!ATTLIST
autor sexo ( F| M) "F" >
<!ATTLIST autor sexo
CDATA "F">
Para exercitar vamos criar um arquivo XML que represente uma nota fiscal com as seguintes características:
No cabeçalho a nota fiscal possui a identificação (série e número) , a empresa emissora , o comprador e a data de emissão. Para a empresa emissora constam o CGC, inscrição estadual , nome ,telefone, endereço e estado. Para o comprador caso seja uma empresa constam os mesmos dados citados. Caso seja uma pessoa física consta CIC , nome , telefone e endereço.
Cada linha da nota fiscal contém o número da linha, o identificador do produto , uma descrição do produto , a quantidade , o preço unitário e o preço total.
No pé da nota fiscal ,constam o total de impostos e o valor total da nota.
Fica como exercício :
Vou mostrar uma das soluções possíveis para o exercício acima. A primeira coisa a fazer para facilitar o nosso trabalho e usar um editor XML. Existem muitos no mercado mas vou citar 3 que acho que são interessantes:
XMLSpy - www.xmlspy.com - Talvez o melhor editor XML . Você pode baixar uma versão demo por 30 dias.
XMLWriter - http://www.tucows.com/preview/302237.html - Editor XML shareware.
Xeena - http://alphaworks.ibm.com/tech/xeena - È um editor XML free.
O melhor é o XMLSpy mas para o exemplo acima vou usar o XMLWriter pois achei mais fácil de instalar. (recomendo o XMLSpy)
Após instalar o XMLWriter , e, seguindo as especificações para a nota fiscal cheguei ao seguinte arquivo XML que representa a nota fiscal:
<?xml version="1.0"?> <nota_fiscal> <cabecalho> <serie></serie> <numero></numero> <empresa> <cgc></cgc> <inscricao_estadual></inscricao_estadual> <nome></nome> <telefone></telefone> <endereco></endereco> <estado></estado> </empresa> <comprador> <pj> <cgc></cgc> <inscricao_estadual></inscricao_estadual> <nome></nome> <telefone></telefone> <endereco></endereco> <estado></estado> </pj> <pf> <cic></cic> <nome></nome> <telefone></telefone> <endereco></endereco> </pf> </comprador> <data_emissao></data_emissao> </cabecalho> <itens> <item> <numero_linha></numero_linha> <identificador_produto></identificador_produto> <descricao_produto></descricao_produto> <quantidade></quantidade> <preco_unitario></preco_unitario> <preco_total></preco_total> </item> <item> <numero_linha></numero_linha> <identificador_produto></identificador_produto> <descricao_produto></descricao_produto> <quantidade></quantidade> <preco_unitario></preco_unitario> <preco_total></preco_total> </item> </itens> <rodape_nota_fiscal> <total_impostos></total_impostos> <valor_total_nota_fiscal></valor_total_nota_fiscal> </rodape_nota_fiscal> </nota_fiscal>
|
|
notafiscal.xml |
O XMLWrite permite a visualização do arquivo em modo de ramificação hierárquica exibido acima ao lado do arquivo XML.
Vamos agora criar o DTD para a nota fiscal descrita no arquivo notafiscal.xml. Usando o XMLWriter criamos o arquivo abaixo chamado notafiscal.dtd.
<!ELEMENT nota_fiscal (cabecalho,itens,rodape)> <!ELEMENT cabecalho (serie, numero, empresa, comprador, data_emissao)> <!ELEMENT serie (#PCDATA)> <!ELEMENT numero (#PCDATA)> <!ELEMENT empresa (cgc, inscricao_estadual, nome, telefone, endereco, estado)> <!ELEMENT cgc (#PCDATA)> <!ELEMENT inscricao_estadual (#PCDATA)> <!ELEMENT nome (#PCDATA)> <!ELEMENT telefone (#PCDATA)> <!ELEMENT endereco (#PCDATA)> <!ELEMENT estado (#PCDATA)> <!ELEMENT comprador (pj,pf)> <!ELEMENT pj (cgc, inscricao_estadual, nome, telefone, endereco, estado)> <!ELEMENT cgc (#PCDATA)> <!ELEMENT inscricao_estadual (#PCDATA)> <!ELEMENT nome (#PCDATA)> <!ELEMENT telefone (#PCDATA)> <!ELEMENT endereco (#PCDATA)> <!ELEMENT estado (#PCDATA)> <!ELEMENT pf (cic, nome, telefone, endereco)> <!ELEMENT cic (#PCDATA)> <!ELEMENT nome (#PCDATA)> <!ELEMENT telefone (#PCDATA)> <!ELEMENT endereco (#PCDATA)> <!ELEMENT data_emissao (#PCDATA)> <!ELEMENT itens (item+)> <!ELEMENT item (numero_linha, identificador_produto, descricao_produto, quantidade, preco_unitario, preco_total)> <!ELEMENT numero_linha (#PCDATA)> <!ELEMENT identificdor_produto (#PCDATA)> <!ELEMENT descricao_produto (#PCDATA)> <!ELEMENT quantidade (#PCDATA)> <!ELEMENT preco_unitario (#PCDATA)> <!ELEMENT preco_total (#PCDATA)> <!ELEMENT rodape(total_impostos, valor_total_nota_fiscal)> <!ELEMENT total_impostos (#PCDATA)> <!ELEMENT valor_total_nota_fiscal (#PCDATA)> |
arquivo DTD notafiscal.dtd |
Podemos verificar se o arquivo esta bem formado e a partir dele podemos gerar o arquivo notafiscal.xml
vai continuar ...