Znění hlášky v jednotlivých parserech
Java hlásí cvc-complex-type.2.4.a: Invalid content was found starting with element, libxml2 (PHP, xmllint, lxml) This element is not expected. Expected is ( … ) a .NET has invalid child element … List of possible elements expected. Ukázky se validují proti tomuto schématu:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="objednavka">
<xs:complexType>
<xs:sequence>
<xs:element name="cislo" type="xs:string"/>
<xs:element name="zakaznik" type="xs:string"/>
<xs:element name="polozka" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Kód cvc-complex-type.2.4.a odkazuje na pravidlo Element Locally Valid
(Complex Type) ze specifikace XML Schema. Část One of '{zakaznik}' is
expected vyjmenovává elementy, které by na tom místě prošly.
Příčiny a opravy
Elementy ve špatném pořadí
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
<zakaznik>Jana Nováková</zakaznik>
<cislo>2026-117</cislo>
<polozka>Hrnek</polozka>
</objednavka> <?xml version="1.0" encoding="UTF-8"?>
<objednavka>
<cislo>2026-117</cislo>
<zakaznik>Jana Nováková</zakaznik>
<polozka>Hrnek</polozka>
</objednavka> xs:sequence předepisuje pořadí. Oba elementy jsou povolené, ale
zakaznik smí přijít až po cislo. Když na pořadí nezáleží a každý
prvek se vyskytuje nejvýš jednou, dá se ve schématu použít xs:all.
Když název sedí, ale chyba zůstává: jmenný prostor
Pokud schéma definuje targetNamespace, musí být elementy v dokumentu ve stejném
jmenném prostoru. Java pak v hlášce uvádí i URI, například
One of '{"urn:example:objednavka":zakaznik}' is expected. Element se správným
názvem, ale bez jmenného prostoru (nebo s jiným), je pro validátor jiný element.
Když nesedí už kořenový element, hlášky jsou jiné: Java cvc-elt.1.a: Cannot find the declaration of element, libxml2 No matching global declaration available for the validation root. Více v kapitole Jmenné prostory.
Jak chybu najít
-
Java validaci zastaví u první chyby, pokud nenastavíš vlastní
ErrorHandler. U ostatních validátorů závisí počet hlášek na API, obsluze chyb a možnosti pokračovat; nelze slíbit úplný seznam. Opravuj od první: jedna chyba v pořadí může vyvolat další. Pravidla ErrorHandler popisuje dokumentace JDK. -
Najdi ve schématu
xs:sequencerodičovského elementu a porovnej pořadí s dokumentem. - Na záložce Schéma ve validátoru můžeš z XSD vygenerovat ukázkový dokument a porovnat ho se svým.
Validace se seznamem všech chyb
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("objednavka.xsd"));
Validator validator = schema.newValidator();
List<String> errors = new ArrayList<>();
validator.setErrorHandler(new ErrorHandler() {
public void warning(SAXParseException e) {}
public void error(SAXParseException e) { errors.add(e.getLineNumber() + ": " + e.getMessage()); }
public void fatalError(SAXParseException e) throws SAXException { throw e; }
});
validator.validate(new StreamSource(new File("objednavka.xml"))); libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->load('objednavka.xml');
if (!$dom->schemaValidate('objednavka.xsd')) {
foreach (libxml_get_errors() as $error) {
echo "Řádek {$error->line}: ", trim($error->message), "\n";
}
libxml_clear_errors();
} from lxml import etree # pip install lxml; standardní knihovna XSD neumí
schema = etree.XMLSchema(etree.parse("objednavka.xsd"))
doc = etree.parse("objednavka.xml")
if not schema.validate(doc):
for error in schema.error_log:
print(f"Řádek {error.line}: {error.message}") var schemas = new XmlSchemaSet();
schemas.Add(null, "objednavka.xsd");
var doc = XDocument.Load("objednavka.xml", LoadOptions.SetLineInfo);
doc.Validate(schemas, (sender, e) => Console.WriteLine($"Řádek {e.Exception.LineNumber}: {e.Message}")); Související
- XML Schema (XSD) — sekvence, výběry a počty výskytů.
- cvc-complex-type.2.4.b — chybí povinný element.
- Rozdíl mezi dobře formovaným a validním dokumentem.
- Přehled všech chybových hlášek.