CodeGym /Cursos /JAVA 25 SELF /Fundamentos de XML e namespaces

Fundamentos de XML e namespaces

JAVA 25 SELF
Nível 47, Lição 0
Disponível

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.

1
Tarefa
JAVA 25 SELF, nível 47, lição 0
Bloqueado
Catálogo Digital de Livros 📚
Catálogo Digital de Livros 📚
1
Tarefa
JAVA 25 SELF, nível 47, lição 0
Bloqueado
Perfil do Usuário na Nova Rede Social 👋
Perfil do Usuário na Nova Rede Social 👋
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION