1. Introdução ao XML
Embora o JSON seja atualmente o padrão, no mundo Java há muito código legacy, então às vezes você pode se deparar com XML. Portanto, é útil ter noção sobre ele. XML (eXtensible Markup Language) é um formato de texto para armazenar e trocar dados estruturados. É frequentemente usado para configurações, troca entre programas, armazenamento de dados e até para serialização de objetos.
Elementos básicos da estrutura de um documento XML:
Tags (elementos):
Tudo o que fica entre < e >. Cada tag é aberta (<tag>) e fechada (</tag>), ou é autoencerrada (<tag/>).
Atributos:
Parâmetros adicionais dentro da tag.
Exemplo: <user name="Vasya" age="25"/>
Nós de texto:
Texto entre as tags.
Exemplo: <greeting>Olá, mundo!</greeting>
Exemplo de um documento XML simples
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="Vasya" age="25">Olá!</user>
<user name="Katya" age="30"/>
</users>
Aqui:
- <users> — elemento raiz.
- <user> — elemento com os atributos name e age; o primeiro usuário tem conteúdo de texto.
2. Conceitos-chave
Prólogo:
A linha no início do arquivo indica a versão do XML e a codificação.
Exemplo: <?xml version="1.0" encoding="UTF-8"?>
Elementos:
Os blocos de construção básicos do XML.
Exemplo: <book>...</book>
Atributos:
Parâmetros dentro da tag de abertura.
Exemplo: <book title="Java" author="Ivanov"/>
Comentários:
Como em HTML, são escritos entre <!-- ... -->.
Exemplo: <!-- Este é um comentário -->
Seções CDATA:
Permitem inserir texto que não será interpretado como XML (por exemplo, com os caracteres <, & etc.).
Exemplo:
<script><![CDATA[
if (a < b && b > 0) { ... }
]]></script>
3. Por que são necessários namespaces (espaços de nomes) em XML
Problema: conflito de nomes
Em documentos XML grandes, é comum encontrar nomes de tags iguais, mas com significados diferentes. Por exemplo, você tem <table> como parte do HTML e <table> como parte da sua lógica de negócio (por exemplo, um banco de dados). Como saber o que cada tag significa?
Sem namespace:
<root>
<table>
<row>...</row>
</table>
<table>
<column>...</column>
</table>
</root>
Aqui não dá para saber a que cada <table> se refere.
Solução: namespaces
Namespace (espaço de nomes) é uma forma de “marcar” elementos e atributos para evitar conflitos de nomes e separar claramente o significado de tags diferentes.
- Cada namespace é um URI único (geralmente parece um link, mas é apenas um identificador).
- Elementos e atributos em namespaces diferentes são considerados distintos, mesmo se o nome for igual.
Vantagens:
- Sem conflitos de nomes entre diferentes padrões e esquemas.
- É possível combinar dados de diferentes fontes em um único documento.
- Fica explícito a qual “dicionário” cada tag pertence.
4. Uso de namespaces: declaração e aplicação
Como declarar um namespace
Na tag de abertura de um elemento escreve-se um atributo especial xmlns (XML Namespace):
- Sem prefixo: xmlns="URI" — declara o namespace padrão para todos os elementos aninhados.
- Com prefixo: xmlns:prefix="URI" — declara um namespace com um nome curto (prefixo), usado nas tags.
Exemplo de declaração e uso de namespace
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Célula 1</h:td>
<h:td>Célula 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Mesa</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Aqui:
- xmlns:h="..." — declara o prefixo h para a tabela HTML.
- xmlns:f="..." — declara o prefixo f para móveis.
- <h:table> e <f:table> — agora são elementos diferentes, mesmo que o nome seja o mesmo.
Como usar um namespace
- Declaração: No elemento raiz ou em qualquer outro: xmlns:prefix="URI"
- Uso: Antes do nome do elemento ou atributo, escreva o prefixo e dois pontos: <prefix:element>...</prefix:element>
Namespace padrão
Se você declarar apenas xmlns="URI", todos os elementos sem prefixo pertencerão a esse namespace.
<books xmlns="http://example.com/books">
<book>...</book>
</books>
5. Prática: criando um documento XML simples com vários namespaces
Vamos criar um exemplo de documento XML que usa dois espaços de nomes: um para HTML e outro para móveis.
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Célula 1</h:td>
<h:td>Célula 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Mesa</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
O que está acontecendo aqui:
- No elemento raiz, dois namespaces são declarados: h e f.
- Todos os elementos com o prefixo h: pertencem à tabela HTML.
- Todos os elementos com o prefixo f: pertencem a móveis.
6. Erros comuns
Erro 1: esqueceu de declarar o prefixo
<root>
<h:table>...</h:table>
</root>
Resultado: O parser de XML emitirá um erro: The prefix 'h' for element 'h:table' is not bound.
Erro 2: nomes iguais sem namespace
<root>
<table>...</table>
<table>...</table>
</root>
Resultado: Não é possível distinguir a que cada <table> se refere.
Erro 3: uso incorreto do prefixo
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>...</h:table>
<f:table>...</f:table> <!-- Erro: o prefixo f não foi declarado -->
</root>
Resultado: Erro do parser: The prefix 'f' for element 'f:table' is not bound.
GO TO FULL VERSION