cvc-complex-type.2.4.a: Invalid content was found starting with element

Dokument je dobře formovaný, ale neodpovídá schématu: na daném místě je element, který tam schéma nepovoluje. Buď je navíc, nebo je ve špatném pořadí, nebo má jiný název či jmenný prostor. Hláška zároveň říká, který element parser na tom místě čekal — podle toho dokument oprav.

Autor: Aktualizováno

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:

objednavka.xsd
<?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>
Parser Hláška Kdy
libxml2 2.13 a novější PHP (DOM, SimpleXML), xmllint, Python lxml, validátor na XML.cz Element 'poznamka': This element is not expected. Expected is ( zakaznik ). Element, který schéma nezná
Element 'zakaznik': This element is not expected. Expected is ( cislo ). Elementy ve špatném pořadí
Java (Xerces) DocumentBuilder, SAXParser, JAXB, Spring, Maven cvc-complex-type.2.4.a: Invalid content was found starting with element 'poznamka'. One of '{zakaznik}' is expected. Element, který schéma nezná
cvc-complex-type.2.4.a: Invalid content was found starting with element 'zakaznik'. One of '{cislo}' is expected. Elementy ve špatném pořadí
.NET XmlDocument, XDocument, XmlReader The element 'objednavka' has invalid child element 'poznamka'. List of possible elements expected: 'zakaznik'. Element, který schéma nezná
The element 'objednavka' has invalid child element 'zakaznik'. List of possible elements expected: 'cislo'. Elementy ve špatném pořadí

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

Element, který schéma nezná

Chybně
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
  <cislo>2026-117</cislo>
  <poznamka>Doručit odpoledne</poznamka>
  <zakaznik>Jana Nováková</zakaznik>
  <polozka>Hrnek</polozka>
</objednavka>
Opraveno
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
  <cislo>2026-117</cislo>
  <zakaznik>Jana Nováková</zakaznik>
  <polozka>Hrnek</polozka>
</objednavka>

Element poznamka schéma vůbec nezná. Buď ho z dokumentu odstraň, nebo — pokud schéma spravuješ ty — ho do schématu doplň (s minOccurs="0", když je nepovinný). Stejně se projeví překlep nebo jiná velikost písmen v názvu elementu.

Elementy ve špatném pořadí

Chybně
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
  <zakaznik>Jana Nováková</zakaznik>
  <cislo>2026-117</cislo>
  <polozka>Hrnek</polozka>
</objednavka>
Opraveno
<?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:sequence rodič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

Java
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")));
PHP
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();
}
Python (lxml)
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}")
C#
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í