Znění hlášky v jednotlivých validátorech
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:
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
<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
<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
<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
- Zjisti místní jméno kořene, v tomto příkladu kniha.
- Zjisti jeho URI prostoru: u kořene bez prefixu jde o platné výchozí xmlns, nebo prázdný prostor.
- 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.