Validez un document XML à l'aide d'un schéma.
La forme la plus simple du problème est présentée dans deux fichiers.
<?xml version="1.0"?>
<recipe
xmlns:r="http://www.namespace.org/recipe">
<r:description>
<r:title>sugar cookies</r:title>
</r:description>
</recipe>
<?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>
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.
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é?
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
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
Dans ma pratique, j'ai obtenu le No matching global declaration available for the validation root
dans deux cas:
<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>