Aucune déclaration globale correspondante n'est disponible pour la racine de validation

Contexte

Valider un document XML à l'aide d'un schéma.

Problème

La forme la plus simple du problème est affichée dans deux fichiers.

Document XML

<?xml version="1.0"?>

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

<r:description>
  <r:title>sugar cookies</r:title>
</r:description>

</recipe>

Document 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>

Erreur

Le message d'erreur complet à partir de xmllint:

Fichier.xml: 4: element recipe: Schemas validity error: Element 'recipe': Aucune déclaration globale correspondante disponible pour la validation racine.

Question

Quelle est la syntaxe correcte (ou quels attributs de schéma sont manquants) pour s'assurer que le schéma donné peut être utilisé pour valider avec succès le document XML donné?

40
demandé sur Dave Jarvis 2011-12-08 08:27:09

3 réponses

Vous devez modifier votre instance XML. Votre actuelle on dit qu'il est à la recherche d'un type appelé description dans l'espace de noms http://www.namespace.org/recipe. Cependant, les seuls types exposés dans cet espace sont appelés recette et descriptionType.

Définissez donc un type appelé description dans le schéma XSD, ou modifiez votre instance pour référencer correctement le type recipe :

<?xml version="1.0" encoding="utf-8"?>
<r:recipe
  xmlns:r="http://www.namespace.org/recipe">
  <description>
    <title>sugar cookies</title>
  </description>
</r:recipe>
24
répondu tom redfern 2015-12-10 10:26:32

Seules les définitions d'éléments globaux peuvent être utilisées comme éléments racine. Votre schéma n'a que des types complexes et donc l'erreur. Changez le <xsd:complexType name="recipe"> en

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

Lire plus à ce sujet ici

14
répondu Aravind R. Yarram 2016-08-07 16:23:10

Dans ma pratique, j'ai obtenu le No matching global declaration available for the validation root dans deux cas:

  • Si XSD ne contient pas un <xsd:element name="recipe" .../> expliqué dans la réponse de @aravind-r-yarram.
  • Si <recipe/> en XML ne contient pas d'attribut xmlns. Dans ce cas, l'ajout de xmlns aidera:

    <recipe xmlns="http://www.namespace.org/recipe">
        ...
    </recipe>
    
2
répondu Artur Klesun 2018-02-05 16:28:55