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.
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.
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
.
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:
.
<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.
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
.
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.
lib
, uni
, soap
).<?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
.
xmlns
(por defecto o con prefijo).Dominar namespaces es esencial para trabajar con XML en proyectos grandes e integraciones de sistemas.