validate validar parse online examples con xml xsd xmllint

validar - xmllint xpath



No hay declaración global coincidente disponible para la raíz de validación (3)

Fondo

Valide un documento XML usando un esquema.

Problema

La forma más simple del problema se muestra en dos archivos.

Documento XML

<?xml version="1.0"?> <recipe xmlns:r="http://www.namespace.org/recipe"> <r:description> <r:title>sugar cookies</r:title> </r:description> </recipe>

Documento XSD

<?xml version="1.0" encoding="utf-8"?> <xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:r="http://www.namespace.org/recipe"> <xsd:complexType name="recipe"> <xsd:choice> <xsd:element name="description" type="descriptionType" minOccurs="1" maxOccurs="1" /> </xsd:choice> </xsd:complexType> <xsd:complexType name="descriptionType"> <xsd:all> <xsd:element name="title"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="5" /> <xsd:maxLength value="55" /> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:all> </xsd:complexType> </xsd:schema>

Error

El mensaje de error completo de xmllint :

file.xml: 4: receta de elemento: Error de validez de esquema: Elemento ''receta'': No hay declaración global coincidente disponible para la raíz de validación.

Pregunta

¿Cuál es la sintaxis correcta (o qué atributos de esquema faltan) para garantizar que el esquema dado se pueda usar para validar con éxito el documento XML dado?


En mi práctica, obtuve la No matching global declaration available for the validation root en dos casos:

  • Si XSD no contiene un <xsd:element name="recipe" .../> explicado en la respuesta de @ aravind-r-yarram.
  • Si <recipe/> en XML no contiene un atributo xmlns . En tal caso, agregar los xmlns ayudará:

    <recipe xmlns="http://www.namespace.org/recipe"> ... </recipe>


Necesita cambiar su instancia de XML. Su actual dice que está buscando un tipo llamado descripción en el espacio de nombres http://www.namespace.org/recipe . Sin embargo, los únicos tipos expuestos en ese espacio de nombres se llaman receta y descriptionType .

Por lo tanto, defina un tipo denominado descripción en el esquema XSD o cambie su instancia para que haga referencia al tipo de receta correctamente:

<?xml version="1.0" encoding="utf-8"?> <r:recipe xmlns:r="http://www.namespace.org/recipe"> <description> <title>sugar cookies</title> </description> </r:recipe>


Solo las definiciones de elementos globales se pueden usar como elementos raíz. Su esquema solo tiene tipos complejos y, por lo tanto, el error. Cambie el <xsd:complexType name="recipe"> a

<xsd:element name="recipe"> <xsd:complexType> <xsd:choice> <xsd:element name="description" type="descriptionType" minOccurs="1" maxOccurs="1" /> </xsd:choice> </xsd:complexType> </xsd:element>

Lea más sobre esto here