cvc-elt.1.a: Cannot find the declaration of element

cvc-elt.1.a: Cannot find the declaration of element hlásí Java (Xerces), když schéma nemá globální deklaraci kořenového elementu. Nejčastěji má kořen jiný jmenný prostor než targetNamespace schématu, jindy jde o překlep v názvu. libxml2 (PHP, xmllint) píše No matching global declaration available for the validation root. .NET kořen z jiného jmenného prostoru ve výchozím nastavení neohlásí vůbec.

Autor: Aktualizováno

Znění hlášky v jednotlivých validátorech

Parser Hláška Kdy
libxml2 2.13 a novější PHP (DOM, SimpleXML), xmllint, Python lxml, validátor na XML.cz Element 'kniha': No matching global declaration available for the validation root. Kořen bez jmenného prostoru, schéma s targetNamespace
Element '{urn:example:knihy}knihy': No matching global declaration available for the validation root. Správný jmenný prostor, ale překlep v názvu kořene
Java (Xerces) DocumentBuilder, SAXParser, JAXB, Spring, Maven cvc-elt.1.a: Cannot find the declaration of element 'kniha'. Kořen bez jmenného prostoru, schéma s targetNamespace
cvc-elt.1.a: Cannot find the declaration of element 'knihy'. Správný jmenný prostor, ale překlep v názvu kořene
.NET XmlDocument, XDocument, XmlReader projde bez chyby Kořen bez jmenného prostoru, schéma s targetNamespace
The 'urn:example:knihy:knihy' element is not declared. Správný jmenný prostor, ale překlep v názvu kořene

Pozor na .NET: když kořen patří do jmenného prostoru, pro který není načtené žádné schéma, XmlReader ho jen přeskočí. Chybu hlásí až tehdy, když schéma pro daný jmenný prostor existuje, ale element v něm není (druhá ukázka). Varování zapneš příznakem:

.NET 10: varování o elementu bez schématu
var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
settings.Schemas.Add(null, "kniha.xsd");
// Bez tohoto příznaku projde kořen z jiného jmenného prostoru bez jediné zprávy.
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += (_, e) => Console.WriteLine($"{e.Severity}: {e.Message}");
// Warning: Could not find schema information for the element 'kniha'.

Příčiny a opravy

XSD s targetNamespace
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:example:knihy">
  <xs:element name="kniha" type="xs:string"/>
</xs:schema>

Kořen bez jmenného prostoru, schéma s targetNamespace

Chybně
<kniha/>
Opraveno
<kniha xmlns="urn:example:knihy"/>

Schéma deklaruje kniha v prostoru urn:example:knihy, dokument v prázdném. Pro validátor jsou to dva různé elementy. Prefix je pouze alias, samotná změna prefixu chybu neřeší.

Správný jmenný prostor, ale překlep v názvu kořene

Chybně
<knihy xmlns="urn:example:knihy"/>
Opraveno
<kniha xmlns="urn:example:knihy"/>

Jmenný prostor souhlasí, ale schéma element knihy nezná. libxml2 v hlášce ukazuje celé rozšířené jméno {urn:example:knihy}knihy, podle kterého obě příčiny rozlišíš.

Tři údaje, které musí souhlasit

  1. Zjisti místní jméno kořene, v tomto příkladu kniha.
  2. Zjisti jeho URI prostoru: u kořene bez prefixu jde o platné výchozí xmlns, nebo prázdný prostor.
  3. Ve skutečně načteném XSD najdi globální deklaraci elementu a targetNamespace.

Přidání xsi:schemaLocation nezmění URI kořene a nezaručuje ani načtení schématu. Pokud příjemce vyžaduje jinou verzi formátu, nemusí stačit změnit xmlns: mezi verzemi se mohou lišit i elementy a jejich pořadí. Použij dokument i schéma pro stejnou verzi. Vazbu popisuje kapitola XML Schema.