# Sistemas de Informação Distribuídos/Interoperação/XML

Extensible Markup Language (XML) é uma linguagem de marcação (markup language) de propósito geral. Originalmente projetada para resolver problemas relacionados à editoração eletrônica e publicação de documentos, seu propósito principal hoje é facilitar a troca de dados entre diferentes sistemas de informação, em particular a Internet.

## Objetivos

XML é usado em documentos com dados estruturados. Informação estruturada contém tanto conteúdo (palavras, imagens, etc.) como alguma indicação de que papel esse conteúdo representa (por exemplo, um título de capítulo ou parágrafo de texto).
Como XML não especifica semântica ou tags padrão, ela se torna uma meta-linguagem: ela permite definir tags e relações estruturais entre elas. A semântica de um documento XML é definida pelas aplicações ou ferramentas que o processam.
XML se presta para a representação de dados semi-estruturados. Um conjunto de dados é dito semi-estruturado quando apresenta as três características a seguir:
* Campos e estruturas repetidas e numerosas em uma representação hierárquica, o que leva a grandes números de tabelas na segunda e na terceira forma normal
* Grandes variações de estrutura
* Tabelas esparsas
XML provê uma representação natural para estruturas hierárquicas com campos repetidos. Esquemas, como DTD ou XSD, controlam as possíveis variações na estrutura. Dados esparsos são facilmente representados em XML, pois a sintaxe apenas registra os dados presentes.

## Histórico

As raízes de XML podem ser traçadas aos primeiros sistemas de processamento de texto construídos pela IBM. Em 1969, a linguagem GML (IBM Generalized Markup Language) foi usada para descrever longos documentos. A implementação mais famosa é do sistema IBM Document Composition Facility (DCF/GML), criado em 1975 pela empresa.
Notando o aumento do uso e o grande potencial, a linguagem foi padronizada, levando à criação da Standard Generalized Markup Language (SGML) entre 1978 e 1986. O principal objetivo de SGML, assim como GML, era a criação de longos documentos de texto destinados a editoração eletrônica.
Entre 1989 e 1993, uma linguagem baseada em SGML foi usada para representar documentos na nascente World Wide Web, a Hypertext Markup Language (HTML). HTML oferece tags para a definição de estilos, permitindo a formatação de documentos.
O objetivo de HTML não era a representação de dados estruturados, e sim a formatação e definição da aparência de documentos para apresentação na tela. Prevendo problemas para a organização de dados na crescente WWW, como a dificuldade de procura e de definição de relacionamentos, na SGML Conference 1996 foi apresentado o primeiro rascunho de "SGML para Web". Esta linguagem teria como objetivo a descrição dos dados, sem se importar com sua apresentação.
Em 1998 foi apresentado pela W3C a especificação final 1.0 de XML. XML foi definido como uma simplificação de SGML.

## Estrutura e sintaxe

Um documento XML é uma árvore de elementos, representados por tags. Os elementos podem conter outros elementos ou atributos.
O documento deve ter exatamente um elemento raiz: todo o texto deve existir entre uma tag raiz de abertura e sua correspondente tag raiz de fechamento. O elemento raiz pode ser precedido apenas por uma declaração de processamento XML ou por comentários.
A sintaxe básica para elementos XML é a seguinte:
O nome da tag é sensível a maiúsculas/minúsculas. Onde se encontra a palavra conteudo, outros elementos XML podem existir.
Elementos não podem se sobrepor: devem sempre estar propriamente contidos. Por exemplo, o seguinte exemplo não é XML:
Para elementos que não apresentam conteúdo, a tag de fechamento pode ser suprimida, desde que a tag de abertura tenha uma barra no final. Por exemplo, as duas linhas a seguir são equivalentes:
Um mecanismo similar a macros é chamado de entidades. Um "e-comercial" (&), seguido de um nome, seguido de ponto-e-vírgula (;) é expandido para o que a entidade representa. XML tem cinco entidades pré-definidas. Por exemplo, para representar o sinal de menor-que, usa-se a entidade &lt;.
O documento que seguir as regras de sintaxe de XML é considerado bem formado (well-formed).

## Esquemas XML

A sintaxe de XML não especifica restrições que a semântica do documento deve apresentar. Isto é realizado pelo esquema, um conjunto de regras que especifica os elementos permitidos, sua estrutura hierárquica e sua quantidade de ocorrências. Por exemplo, em um documento que represente uma biblioteca, a restrição de ocorrência de apenas um elemento <isbn> dentro de um elemento <book> é definida em seu esquema.
Se um documento XML, além de ser bem formado, respeita as regras de seu esquema, é dito válido (valid).
Os esquemas XML podem ser representados em dois formatos: DTD e XML Schema.

### DTD

O Document Type Definition (DTD) é o formato mais antigo, herdado diretamente de SGML. Permite representar os elementos existentes e quais são permitidos em seus conteúdos usando uma linguagem regular simples.
Os elementos do DTD são especificados em uma tag DOCTYPE, no topo do documento XML.
Um exemplo para biblioteca é:
Se fosse validado contra esse DTD, o seguinte documento XML seria válido:

### XML Schema

XML Schema é uma linguagem considerada pela W3C como a sucessora de DTD. Ao invés de ser definida em SGML, é definida na própria linguagem XML. Isto permite usar as mesmas ferramentas para o documento e para a definição do esquema.
Conhecido também pela sigla XSD (XML Schema Definition), apresenta o conceito de tipos de dados. Enquando DTD compreende apenas "caracteres" como conteúdo de tags, XSD tem tipos de dados como decimal, ponto flutuante e datas.
O modelo de dados de XML Schema inclui:
* vocabulário (elementos e seus atributos)
* modelo de conteúdo (relacionamentos e atributos)
* tipos de dados
A coleção desses três tipos de informação produz o chamado Post-Schema-Validation Infoset (PSVI). O PSVI pode ser visto como um objeto em um paradigma OOP.
A definição de um XML Schema é normalmente feita com um arquivo auxiliar de extensão .xsd.

## Processamento de XML

Existem duas interfaces de programação principais para o processamento de documentos XML: DOM e SAX.

### DOM

Document Object Model (DOM) foi a primeira interface de programação para processar XML. O documento é inteiro lido em memória e apresentado à aplicação como uma árvore de objetos. Todos os elementos e atributos são representados por objetos Node.
DOM se mantém próximo ao modelo em árvore de XML e permite acessar facilmente qualquer elemento contido. No entanto, como essa árvore de objetos deve ser toda gerada em memória, DOM não pode ser usado para documentos grandes demais.

### SAX

Simple API for XML (SAX) adota um modelo radicalmente diferente de DOM. SAX é dirigido por eventos: o documento XML é lido seqüencialmente e, para cada evento de interesse, como a abertura de uma tag ou ocorrência de caracteres, uma função callback é chamada.
Ao contrário de DOM, não é preciso ler o documento inteiro em memória para ser manipulado pela aplicação. No entanto, a estrutura em callbacks dificulta a programação, cabendo ao desenvolvedor manter informações de estado em uma pilha separada que identifique a posição atual do documento e os dados de interesse.

## Vantagens e desvantagens
### Vantagens

XML é considerado um formato para homens e para máquinas. Por um lado, documentos criados usando essa linguagem são gerados em texto puro, permitindo a pessoas interpretá-los e a ferramentas manipulá-lo facilmente. Apresenta também suporte a Unicode, afastando problemas de línguas e alfabetos diferentes. Por outro, o processamento é muito fácil.
A estrutura básica de XML, a árvore, é considerada comum e se presta para a descrição de dados estruturados e semi-estruturados. Sua sintaxe é auto-documentada através de tags, um contraste com os delimitadores de linguagens como EDI.
A definição de esquemas permite a associação de regras semânticas aos documentos e sua validação através de ferramentas.

### Desvantagens

A sintaxe de XML é muito prolixa e redundante, com repetição das tags. Isto acarreta em um custo mais alto de armazenamento e de transmissão de dados.
XML não suporta em seu núcleo tipos de dados diferentes de strings de texto. Isto é possível apenas ao usar extensões como XML Schema. A expressão de regras de semântica é prejudicada por esse ponto.
O modelo de dados é limitado: apenas hierárquico (árvore, estrutura básica) ou grafo (usando extensões). Em seu núcleo, suporta apenas relacionamentos hierárquicos: demais modelos, apenas por extensões.
A definição de um esquema é opcional. Apesar de flexibilizar o desenvolvimento, pode causar problemas futuros ao não forçar a padronização de formatos de dados.

## Links externos

* The Roots of SGML -- A Personal Recollection, por Charles F. Goldfarb
* Especificação XML 1.0
* Princípios de projeto para XML
* Happy Birthday, XML!, por Hollander e Sperberg-McQueen. Um panorama dos cinco primeiros anos de XML
* Thinking XML: The XML Decade, por Uche Ogbuji
* XML: ten year aniversary, por Eliot Kimber