Espacios de nombres (Namespaces) en XML

1. ¿Qué es un namespace en XML?

Un espacio de nombres (namespace) es una forma de identificar de manera única los elementos y atributos dentro de un documento XML. Se utiliza principalmente para evitar conflictos de nombres cuando se combinan datos de diferentes vocabularios o estándares.

Se define con un atributo especial xmlns dentro de un elemento.

Ejemplo básico (namespace por defecto):

<libro xmlns="http://ejemplo.com/biblioteca">
    <titulo>Don Quijote</titulo>
    <autor>Miguel de Cervantes</autor>
</libro>

Aquí xmlns="http://ejemplo.com/biblioteca" define el namespace por defecto. Todos los elementos dentro de <libro> pertenecen a ese espacio de nombres.

2. Problema que resuelven los namespaces

Imaginemos que queremos unir información de dos sistemas distintos, cada uno con su propia definición de <titulo>.

Ejemplo sin namespaces (conflicto):

<documento>
    <titulo>Don Quijote</titulo>   <!-- ¿Título de un libro? -->
    <titulo>Lic. en Informática</titulo> <!-- ¿Título académico? -->
</documento>

El procesador XML no puede distinguir a qué tipo de título se refiere cada etiqueta.

Con namespaces:

<documento 
    xmlns:lib="http://ejemplo.com/libros" 
    xmlns:uni="http://ejemplo.com/universidad">
    
    <lib:titulo>Don Quijote</lib:titulo>
    <uni:titulo>Lic. en Informática</uni:titulo>
</documento>

Ahora queda claro: lib:titulo pertenece al namespace de libros y uni:titulo al de universidad.

3. Sintaxis de namespaces

a) Declaración por defecto

Todos los elementos dentro de un nodo heredan el mismo namespace.

<biblioteca xmlns="http://ejemplo.com/biblioteca">
    <libro>
        <titulo>La Odisea</titulo>
    </libro>
</biblioteca>

Aquí todos los elementos pertenecen a http://ejemplo.com/biblioteca.

b) Declaración con prefijo

Se usa un prefijo para identificar un namespace.

<biblioteca xmlns:lib="http://ejemplo.com/libros">
    <lib:libro>
        <lib:titulo>Hamlet</lib:titulo>
    </lib:libro>
</biblioteca>

xmlns:lib="http://ejemplo.com/libros" define el namespace con prefijo lib. Ahora cada elemento debe usar el prefijo lib:.

c) Varios namespaces en el mismo documento

<documento 
    xmlns:lib="http://ejemplo.com/libros" 
    xmlns:uni="http://ejemplo.com/universidad">
    
    <lib:libro>
        <lib:titulo>Don Quijote</lib:titulo>
    </lib:libro>
    
    <uni:alumno>
        <uni:nombre>Laura</uni:nombre>
        <uni:titulo>Lic. en Matemática</uni:titulo>
    </uni:alumno>
</documento>

Aquí combinamos datos de libros y de universidad en un solo XML sin conflictos.

4. Namespaces y atributos

Los atributos también pueden pertenecer a namespaces:

<empleado xmlns:info="http://ejemplo.com/empleados" info:id="1001">
    <nombre>Carlos</nombre>
</empleado>

Aquí el atributo id pertenece al namespace info.

5. Namespaces en la práctica (ejemplos reales)

  • XHTML usa namespaces para diferenciar elementos de HTML.
  • SOAP (protocolos de servicios web) define sus mensajes XML con namespaces para separar encabezados y cuerpo.

Ejemplo SOAP (simplificado):

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <!-- Encabezado de la solicitud -->
    </soap:Header>
    <soap:Body>
        <!-- Datos de la operación -->
    </soap:Body>
</soap:Envelope>

Los elementos soap:Envelope, soap:Header y soap:Body pertenecen al namespace SOAP.

6. Buenas prácticas con namespaces

  • Usar URIs únicas como identificadores de namespace (no tienen que ser enlaces reales).
  • Usar prefijos cortos y descriptivos (lib, uni, soap).
  • Evitar el uso excesivo de namespaces si no es necesario.
  • Documentar qué namespace corresponde a cada prefijo.

7. Ejemplo completo con múltiples namespaces

<?xml version="1.0" encoding="UTF-8"?>

<registro 
    xmlns:lib="http://ejemplo.com/libros" 
    xmlns:per="http://ejemplo.com/personas">
    
    <!-- Información de un libro -->
    <lib:libro>
        <lib:titulo>1984</lib:titulo>
        <lib:autor>George Orwell</lib:autor>
    </lib:libro>
    
    <!-- Información de una persona -->
    <per:persona>
        <per:nombre>Ana</per:nombre>
        <per:apellido>Pérez</per:apellido>
    </per:persona>
</registro>

Aquí: los elementos relacionados con libros (libro, título, autor) están en el namespace lib, y los de persona (nombre, apellido) en el namespace per.

8. Resumen didáctico

  • Los namespaces en XML evitan conflictos de nombres cuando se combinan datos de distintos orígenes.
  • Se definen con el atributo xmlns (por defecto o con prefijo).
  • Se aplican tanto a elementos como a atributos.
  • Son fundamentales en estándares modernos como XHTML, SOAP y SVG.

Dominar namespaces es esencial para trabajar con XML en proyectos grandes e integraciones de sistemas.