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:

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:

Um arquivo XMl contém texto e marcação XML. lembrando que as tags XML obedecem , rigorosamente , as seguintes regras:

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>
      <nome>Macoratti</nome>
      <professor/>
</pessoa>

Outra forma seria representar o elemento usando a notação padrão:

<pessoa>
      <nome>Macoratti</nome>
      <professor></professor>
</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:

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:

  1. XMLSpy - www.xmlspy.com - Talvez o melhor editor XML . Você pode baixar uma versão demo por 30 dias.

  2. XMLWriter - http://www.tucows.com/preview/302237.html - Editor XML shareware.

  3. 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 ...