CodeGym /Cursos /JAVA 25 SELF /Fundamentos de XML y espacios de nombres

Fundamentos de XML y espacios de nombres

JAVA 25 SELF
Nivel 47 , Lección 0
Disponible

1. Introducción a XML

Aunque hoy JSON es el estándar, en el mundo de Java hay mucho código heredado (legacy), por lo que a veces puedes encontrarte con XML. Así que tener una idea de qué es resulta útil. XML (eXtensible Markup Language) es un formato de texto para almacenar e intercambiar datos estructurados. Se utiliza a menudo para configuraciones, intercambio entre programas, almacenamiento de datos e incluso para la serialización de objetos.

Elementos básicos de la estructura de un documento XML:

Etiquetas (elementos):
Todo lo que va entre < y >. Cada etiqueta se abre (<tag>) y se cierra (</tag>), o es autoconclusiva (<tag/>).

Atributos:
Parámetros adicionales dentro de la etiqueta.
Ejemplo: <user name="Vasya" age="25"/>

Nodos de texto:
Texto entre etiquetas.
Ejemplo: <greeting>¡Hola, mundo!</greeting>

Ejemplo de un documento XML sencillo

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user name="Vasya" age="25">¡Hola!</user>
    <user name="Katya" age="30"/>
</users>

Aquí:

  • <users> — elemento raíz.
  • <user> — elemento con los atributos name y age; el primer usuario tiene contenido de texto.

2. Conceptos clave

Prólogo:
La línea al principio del archivo indica la versión de XML y la codificación.
Ejemplo: <?xml version="1.0" encoding="UTF-8"?>

Elementos:
Los bloques de construcción principales de XML.
Ejemplo: <book>...</book>

Atributos:
Parámetros dentro de la etiqueta de apertura.
Ejemplo: <book title="Java" author="Ivanov"/>

Comentarios:
Como en HTML, se escriben entre <!-- ... -->.
Ejemplo: <!-- Este es un comentario -->

Secciones CDATA:
Permiten insertar texto que no se interpretará como XML (por ejemplo, con símbolos <, &, etc.).
Ejemplo:

<script><![CDATA[
    if (a < b && b > 0) { ... }
]]></script>

3. Por qué se necesitan los namespaces (espacios de nombres) en XML

Problema: conflicto de nombres

En documentos XML grandes a menudo aparecen nombres de etiquetas iguales pero con distinto significado. Por ejemplo, tienes <table> como parte de HTML y <table> como parte de tu lógica de negocio (por ejemplo, una base de datos). ¿Cómo saber qué etiqueta significa qué?

Sin namespace:

<root>
    <table>
        <row>...</row>
    </table>
    <table>
        <column>...</column>
    </table>
</root>

Aquí no está claro a qué corresponde cada <table>.

Solución: namespaces

Namespace (espacio de nombres) es una forma de “marcar” elementos y atributos para evitar conflictos de nombres y separar con claridad el significado de las distintas etiquetas.

  • Cada namespace es un URI único (suele parecer un enlace, pero es solo un identificador).
  • Elementos y atributos con distintos namespaces se consideran diferentes, incluso si el nombre coincide.

Ventajas:

  • No hay conflictos de nombres entre distintos estándares y esquemas.
  • Se pueden combinar datos de distintas fuentes en un mismo documento.
  • Se ve claramente a qué “vocabulario” pertenece cada etiqueta.

4. Uso de namespaces: declaración y aplicación

Cómo declarar un namespace

En la etiqueta de apertura de un elemento se escribe el atributo especial xmlns (XML Namespace):

  • Sin prefijo: xmlns="URI" — declara el espacio de nombres por defecto para todos los elementos anidados.
  • Con prefijo: xmlns:prefix="URI" — declara un espacio de nombres con un nombre corto (prefijo) que se utiliza para las etiquetas.

Ejemplo de declaración y uso de namespaces

<root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="http://www.w3schools.com/furniture">
    <h:table>
        <h:tr>
            <h:td>Celda 1</h:td>
            <h:td>Celda 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>

Aquí:

  • xmlns:h="..." — declara el prefijo h para la tabla HTML.
  • xmlns:f="..." — declara el prefijo f para los muebles.
  • <h:table> y <f:table> — ahora son elementos distintos, incluso si el nombre es el mismo.

Cómo usar un namespace

  • Declaración: En el elemento raíz o en cualquier otro: xmlns:prefix="URI"
  • Uso: Antes del nombre del elemento o del atributo se escribe el prefijo y dos puntos: <prefix:element>...</prefix:element>

Namespace por defecto

Si se declara simplemente xmlns="URI", todos los elementos sin prefijo pertenecerán a ese namespace.

<books xmlns="http://example.com/books">
    <book>...</book>
</books>

5. Práctica: crear un documento XML sencillo con varios namespaces

Vamos a crear un ejemplo de documento XML en el que se usan dos espacios de nombres: uno para HTML y otro para muebles.

<?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>Celda 1</h:td>
            <h:td>Celda 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>

Qué ocurre aquí:

  • En el elemento raíz se declaran dos namespaces: h y f.
  • Todos los elementos con el prefijo h: pertenecen a la tabla HTML.
  • Todos los elementos con el prefijo f: pertenecen a los muebles.

6. Errores típicos

Error 1: se olvidó declarar el prefijo

<root>
    <h:table>...</h:table>
</root>

Resultado: El analizador XML dará un error: The prefix 'h' for element 'h:table' is not bound.

Error 2: nombres iguales sin namespace

<root>
    <table>...</table>
    <table>...</table>
</root>

Resultado: No es posible distinguir a qué <table> corresponde cada una.

Error 3: uso incorrecto del prefijo

<root xmlns:h="http://www.w3.org/TR/html4/">
    <h:table>...</h:table>
    <f:table>...</f:table> <!-- Error: el prefijo f no está declarado -->
</root>

Resultado: Error del analizador: The prefix 'f' for element 'f:table' is not bound.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION