Tutorial XML
O XML é uma linguagem de marcação como o HTML. Sua diferença é utilizar uma linguagem própria. Ao invés de colocarmos <table border=0 cellspacing=1>, podemos criar um "tag" chamado <tabela>, que terá estas propriedades.
Ao invés de chamarmos de tag, vamos chamar de nós (node). Comparando ao HTML, o nó <tr> seria um nó filho do <table>. Podemos dizer o mesmo de <td> em relação a <tr>. Isto será muito importante adiante. Aqui vão algumas regras de XML:
- Sempre coloque o tag de xml no início do arquivo xml:
<?xml version="1.0"?>
- Sempre feche os nós em ordem :
<a><b></b></a>.
- Há diferença entre nomes em maiúsculas e minúsculas.
<teste><TESTE></TESTE></teste>
Ele diferencia os dois nós. Também não podemos alterar a formatação do nome, pois ele não o reconhecerá :
<teste></Teste>
(acusará erro de nó não fechado)
- Os nós não podem ser puramente numéricos, com espaço ou com alfanuméricos. E també, pessoalmente, não aconselho a usar , verão o porque.
- Todo arquivo XML deverá ter um nó mãe.
- Todos os nós devem ser fechados. Caso um nó seja "único", como o <br>, ele deverá ter a barra no fim, <br/>.
- Todos os atributos dentro do nó (como o border no table) devem ter seu valor entre aspas : <teste valor="25">
Aqui está o nosso primeiro arquivo teste, vamos chamá-lo de edicao.xml:
Arquivo edicao.xml
<?xml version="1.0"?> <edicao> <artigo> <artigo_id>1</artigo_id> <titulo>Primeiro arquivo de XML</titulo> </artigo> <artigo> <artigo_id>2</artigo_id> <titulo>Bla Bla Bla</titulo> </artigo> </edicao>
Perceberam a semelhança dele a uma estrutura de banco de dados? Imagine num banco de dados a tabela edição, onde chamaremos os artigos cadastrados para um Recordset chamado de artigo, onde virão as colunas artigo_id e titulo. Qualquer semelhança não é mera coincidência. O SQL Server 2000 já gera automaticamente um arquivo XML se solicitado.
Agora que já temos oção do que é o xml, vamos pensar, para que diabos eu vou querer usar isso? Vamos a algumas opções:
1)Diferentemente de banco de dados, onde precisamos de programas para nos conectar e ver ou alterar seu conteúdo, temos um arquivo com toda a "tabela", ou até com todo o banco de dados. Podemos descê-lo facilmente da internet e visualizá-lo nos navegadores (criem este arquivo edicao.xml e vejam-no no browser, mesmo que não tenhamos deixado ele tão bonito quanto aparece, os browsers nos ajudam
2)Somente montamos nossos bancos de dados pelos mesmos programas (tudo para gastarmos mais!). Para montar um XML, só temos que ler alguns livros ou tutoriais e já temos tudo! E visualizamos de uma maneira bem mais clara do que um banco de dados.
3)Se vamos fazer algo que tenha pouco conteúdo, ou estamos enviando para o usuário uma pequena parte de nosso banco de dados, ao invés de enviarmos o HTML pronto, podemos enviar o arquivo XML , de pouquíssimos kB, e deixar com que o usuário possa até mexer em sua visualização (como por simples scripts, alterar o tamanho da fonte, ou enviar todas as páginas de uma paginação de uma vez, agilizando a visualização).
4)Em aplicações maiores, como um site de comércio eletrônico com o banco de dados SQL Server tendo que enviar as compras do dia para um banco de dados Oracle interno da empresa, temos que fazer complexas programações para converter os formatos. SE ambos os bancos de dados já suportam XML, porque não somente gerar um ou mais arquivos XML e atualizá-los no outro banco? Programação complexa substituída por umas dez linhas de código? Ótimo!!!
Acho que agora já estão com água na boca de poder fazer isso. Alguns já devem estar perguntando?
Mas no banco de dados eu posso definir os formatos dos campos ? Também posso fazer isso no XML?
Posso colocar estilo neste XML para o usuário?
Posso misturar tudo, XML, HTML, CSS e Javascript?
Vamos por partes, mas sim, você pode fazer tudo isso. Vamos primeiramente ver como aplicar estilos (webdesigners, fiquem tranquilos, não será isso que fará vocês terem que esquecer XML)
Definindo o arquivo XML
Como todo programador que já uma tabela no banco de dados, sabe que temos que dizer qual o formato de cada campo. O XML também permite que faça isso.
Existem dois principais formatos para fazer isso: o DTD e o Schema. O DTD é o formato feito pelo w3c, o mesmo que regulariza o HTML. Ele apresenta certas limitações, a que mais senti foi não ter a mesma forma de XML. Um DTD de exemplo, para nosso arquivo edição, está abaixo.
edicao.xml (com DTD)
<?xml version="1.0"?> <!DOCTYPE edicao[ <!ELEMENT edicao (artigo+)> <!ELEMENT artigo (artigo_id, titulo)> <!ELEMENT artigo_id (#PCDATA)> <!ELEMENT titulo (#PCDATA)> ]> <edicao> <artigo> <artigo_id>1</artigo_id> <titulo>Primeiro arquivo de XML</titulo> </artigo> <artigo> <artigo_id>2</artigo_id> <titulo>Bla Bla Bla</titulo> </artigo> </edicao>
Eu não o utilizo, por isso não o explicarei neste tutorial. Quem se interessar mais pelo formato, veja no próprio site www.w3c.com.
Aprofundei meus estudos em Schema por trabalhar principalmente em servidores Microsoft. As versões de interpretadores de XML da Microsoft dão suporte a muitas operações muito úteis. Comecei utilizando DTD, mas ao não conseguir (provavelmente por não saber mesmo, não encontrei uma informaçào boa e clara em lugar nenhum) sobre ordenação de valores XML, passei para os Schemas.
Schemas nada mais é do que uma definição por um padrão XML previamente estabelecido sobre o conteúdo do arquivo. Pode estar no próprio arquivo XML ou em um separado. Para usarmos a definição, utilizamos o chamado namespace, que é um chamado de padrão universal. Para chamar o schema, utilizaremos xmlns="x-schema:schema_edicao.xml", que é o arquivo que tem o schema.
No schema, utilizaremos o namespace xmlns:dt="urn:schemas-microsoft-com:datatypes", que nos fornece uma gama de tipos de elementos. Sofri muito para entender os namespaces diferentes para cada ocasião, vamos vendo isso conforme o andar do tutorial. Temos um tipo de namespace para cada utilização que queremos, como verão.
Para definir um nó, usaremos o tag ElementType. Ele tem os atributos name, com o nome do nó, e dt:type, onde colocaremos o tipo do nó. Os tipos fornecidos por este namespace são : boolean, char, date( só a data), dateTime (data e hora), float, int, string, number e time. Creio que os nomes dizem por si. Existem muitos outros, mas estes são os principais. Para ver outros, veja no site da Microsoft as especificações dos datatypes.
Também podemos ter os atributos:
-content: define o que o elemento pode ter. Seus possíveis valores são : empty (não terá valor), textOnly(só pode ter texto), eltOnly(somente elementos especificados) e mixed (qualquer um)
-order : define a ordem. Pode ter os valores : one (somente permite que o n;ó tenha UM único filho, mesmo que possa ter mais de um possivel, é como a clausula ou, terá um ou outro, mas somente um), seq (os elementos terão que aparecer na ordem específica) ou many (em qualquer ordem)
-model: se tiver o valor open, ele pode ter nós filhos além dos declarados, se closed, somente os declarados.
Além do ElementType, temos o tag element, para definir os nós filhos do elemento. Terá o nome, claro,e pode ter outros dois atributos:
-minOccurs: se for 0, o elemento especificado não é obrigatório, se for 1, tem que aparecer no mínimo uma vez
-maxOccurs: se for 1, o elemento deve aparecer no máximo uma vez,se for *, quantas vezes quiser.
Também temos que declarar os atributos de cada nó, com o tag AttributeType. Seus atributos são:
-name
-default : seu valor padrão
-dt:type : seu tipo de dado, os mesmos possíveis dos elementos.
-dt:values: com os possíveis valores do atributo (opcional)
-required: se com o valor yes, obrigatório (opcional)
Para o associarmos ao nó, o colocamos no tag ElementType com o tag attribute, que pode ter os seguintes atributos (esta palavra está começando a ficar repetitiva!):
-default : seu valor padrão
-type : os mesmo que os elementos
-required :exatamente o mesmo que o AttributeType
Meio confuso, né? Só com a prática isso fica bem entendido. Vamos fazer um schema para nosso exemplo então. Temos o nó edicao, que terá o nó artigo. Este, por sua vez, terá seus filhos artigo_id, que queremos que seja sempre um número, e titulo, que pode ser qualquer coisa. Não nos importamos com a ordem, não é necessário que exista um artigo, mas pdoem haver inúmeros. Só deveremos ter um id e um titulo para cada artigo, e estes deverào ser obrigatórios.
Então, ficaria assim *utilizarei o tag description para comentar, mais uma vantagem do schema):
schema_edicao.xml
<Schema name="valida" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="artigo_id" dt:type="int" /> <ElementType name="titulo" dt:type="string" /> <ElementType name="artigo"> <description> Nó com o id e titulo do artigo </description> <element type="artigo_id" minOccurs="1" maxOccurs="1"/> <element type="titulo" minOccurs="1" maxOccurs="1"/> </ElementType> <ElementType name="edicao"> <description> Nó mãe com todos os artigos da edição </description> <element type="artigo" minOccurs="1" maxOccurs="1"/> </ElementType> </Schema>
E no arquivo edicao.xml, colocaremos o nó edicao assim : <edicao xmlns="x-schema:schema_edicao.xml">.
Podemos usar mais de um schema por arquivo, mas lembre-se que os schemas de um nó se propagam por todos os seus filhos. Se colocassemos o schema no próprio arquivo, colocaríamos #nome ao invés de linkar ao arquivo.
Agora, vamos ver como colocaremos estilos no xml.