web-dev-qa-db-fra.com

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

Contexte

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

Problème

La forme la plus simple du problème est présenté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 de xmllint :

file.xml: 4: recette de l'élément: erreur de validité des schémas: élément "recette": aucune déclaration globale correspondante disponible pour la racine de validation.

Question

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

47
Dave Jarvis

Vous devez modifier votre instance XML. Votre actuel dit qu'il y a un type appelé description dans l'espace de noms http://www.namespace.org/recipe . Cependant, dans votre définition XSD, les seuls types exposés dans cet espace de noms sont appelés recette et descriptionType.

Donc, définissez un type appelé description dans le schéma XSD, ou modifiez votre instance afin de référencer correctement le type recette:

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

[~ # ~] mise à jour [~ # ~] Ce n'est que la moitié de la solution - l'autre moitié est dans la réponse de @ Aravind ici: https://stackoverflow.com/a/8426185/569662

27
tom redfern

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

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

En savoir plus à ce sujet ici

14
Aravind R. Yarram

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

  • Si XSD ne contient pas de <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>
    
4
Artur Klesun