Bien formado vs. válido en XML

En XML existen dos conceptos fundamentales para evaluar un documento:

  • Bien formado (well-formed): cumple las reglas básicas de sintaxis de XML.
  • Válido (valid): además de estar bien formado, respeta un conjunto de reglas definidas en un DTD o XML Schema (XSD).

Todo documento válido es necesariamente bien formado, pero no todo documento bien formado es válido.

1. XML Bien Formado

Un documento XML es bien formado si cumple con las reglas básicas de sintaxis:

  • Tiene un único elemento raíz.
  • Todas las etiquetas se abren y cierran correctamente.
  • Los elementos están correctamente anidados (no cruzados).
  • Los atributos tienen valores entre comillas.
  • Diferencia entre mayúsculas y minúsculas (<Nombre><nombre>).
  • No se permiten caracteres inválidos.

Ejemplo de XML bien formado:

<?xml version="1.0" encoding="UTF-8"?>
<persona>
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <edad>30</edad>
</persona>

Cumple todas las reglas básicas de sintaxis.

Ejemplo de XML mal formado:

<persona>
    <nombre>Ana
    <apellido>Pérez</nombre>
</apellido>
</persona>

Errores:

  • Etiquetas mal anidadas (apellido se abre dentro de nombre pero se cierra fuera).
  • El contenido queda inconsistente.

2. XML Válido

Un documento XML es válido si:

  • Está bien formado.
  • Sigue un conjunto de reglas definidas en un DTD o XML Schema (XSD).

Estas reglas especifican, por ejemplo:

  • Qué elementos pueden aparecer.
  • El orden de los elementos.
  • Qué atributos son obligatorios o permitidos.
  • Qué valores son aceptables (tipos de datos, restricciones).

Ejemplo con DTD

DTD (reglas):

<!DOCTYPE persona [
    <!ELEMENT persona (nombre, apellido, edad)>
    <!ELEMENT nombre (#PCDATA)>
    <!ELEMENT apellido (#PCDATA)>
    <!ELEMENT edad (#PCDATA)>
]>

Documento válido (cumple el DTD):

<?xml version="1.0" encoding="UTF-8"?>
<persona>
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <edad>30</edad>
</persona>

Documento bien formado pero no válido (no cumple el DTD):

<?xml version="1.0" encoding="UTF-8"?>
<persona>
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <!-- Falta el elemento obligatorio <edad> -->
</persona>

Este documento es bien formado (sintaxis correcta), pero no es válido porque no cumple las reglas del DTD.

Ejemplo con XML Schema (XSD)

XSD (reglas):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="persona">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="nombre" type="xs:string"/>
        <xs:element name="apellido" type="xs:string"/>
        <xs:element name="edad" type="xs:integer"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Documento válido (cumple el XSD):

<persona>
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <edad>30</edad>
</persona>

Documento bien formado pero no válido (violando el XSD):

<persona>
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <edad>treinta</edad>
</persona>

Es bien formado (etiquetas correctas), pero no válido, porque edad debería ser un número entero (xs:integer), no texto.

3. Comparación clara

  • Bien formado: cumple reglas básicas de XML.
  • Válido: cumple reglas de un DTD/XSD.
  • Esquema requerido: bien formado (no), válido (sí).
  • Procesable: ambos por cualquier parser XML; el válido además pasa validación contra el esquema.

4. Ejemplo resumen

<!-- Bien formado pero no válido (falta <edad>): -->
<persona>
    <nombre>Laura</nombre>
    <apellido>Gómez</apellido>
</persona>

<!-- Bien formado y válido (cumple con DTD/XSD): -->
<persona>
    <nombre>Laura</nombre>
    <apellido>Gómez</apellido>
    <edad>25</edad>
</persona>

5. Resumen didáctico

  • Bien formado = cumple la sintaxis básica de XML.
  • Válido = además respeta reglas definidas en un DTD o XSD.
  • Todo documento válido es bien formado, pero no todo documento bien formado es válido.
  • La validación garantiza que los datos cumplen un contrato estructural (muy usado en sistemas empresariales y servicios web).