En XML existen dos conceptos fundamentales para evaluar un documento:
Todo documento válido es necesariamente bien formado, pero no todo documento bien formado es válido.
Un documento XML es bien formado si cumple con las reglas básicas de sintaxis:
<Nombre>
≠ <nombre>
).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:
Un documento XML es válido si:
Estas reglas especifican, por ejemplo:
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.
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.
<!-- 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>