No matching global declaration available for the validation root

XmlXsdXmllint

Xml Problem Overview


Background

Validate an XML document using a schema.

Problem

The simplest form of the problem is shown in two files.

XML Document
<?xml version="1.0"?>

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

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

</recipe>
XSD Document
<?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

The full error message from xmllint:

> file.xml:4: element recipe: Schemas validity error : Element 'recipe': No matching global declaration available for the validation root.

Question

What is the correct syntax (or what schema attributes are missing) to ensure that the given schema can be used to successfully validate the given XML document?

Xml Solutions


Solution 1 - Xml

You need to change your XML instance. Your current one says that there is a type called description in the namespace http://www.namespace.org/recipe. However, in your XSD definition, the only types exposed in that namespace are called recipe and descriptionType.

So either define a type called description in the XSD schema, or change your instance so you are referencing the recipe type correctly:

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

UPDATE This is only half the solution - the other half is in @Aravind's answer here: https://stackoverflow.com/a/8426185/569662

Solution 2 - Xml

Only global element definitions can be used as root elements. Your schema only has complex types and hence the error. Change the <xsd:complexType name="recipe"> to

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

Read more about this here

Solution 3 - Xml

In my practice, I got the No matching global declaration available for the validation root in two cases:

  • If XSD does not contain an <xsd:element name="recipe" .../> explained in @aravind-r-yarram's answer.

  • If <recipe/> in XML does not contain an xmlns attribute. In such case adding the xmlns will help:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDave JarvisView Question on Stackoverflow
Solution 1 - Xmltom redfernView Answer on Stackoverflow
Solution 2 - XmlAravind YarramView Answer on Stackoverflow
Solution 3 - XmlKlesunView Answer on Stackoverflow