cvc-complex-type.2.4.b: The content of element is not complete

V elementu chybí potomek, který schéma vyžaduje. Každý element v xs:sequence je povinný, pokud nemá minOccurs="0". Hláška vyjmenuje, co chybí — doplň to do dokumentu, nebo ve schématu, které spravuješ, označ element jako nepovinný. Pozor: když chybí element uprostřed, Java hlásí 2.4.a, ne 2.4.b.

Autor: Aktualizováno

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

Java hlásí cvc-complex-type.2.4.b: The content of element '…' is not complete, libxml2 (PHP, xmllint, lxml) Missing child element(s). Expected is ( … ) a .NET has incomplete content. 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 'objednavka': Missing child element(s). Expected is ( polozka ). Chybí povinný element na konci
Element 'polozka': This element is not expected. Expected is ( zakaznik ). Chybí povinný element uprostřed
Java (Xerces) DocumentBuilder, SAXParser, JAXB, Spring, Maven cvc-complex-type.2.4.b: The content of element 'objednavka' is not complete. One of '{polozka}' is expected. Chybí povinný element na konci
cvc-complex-type.2.4.a: Invalid content was found starting with element 'polozka'. One of '{zakaznik}' is expected. Chybí povinný element uprostřed
.NET XmlDocument, XDocument, XmlReader The element 'objednavka' has incomplete content. List of possible elements expected: 'polozka'. Chybí povinný element na konci
The element 'objednavka' has invalid child element 'polozka'. List of possible elements expected: 'zakaznik'. Chybí povinný element uprostřed

Příčiny a opravy

Chybí povinný element na konci

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

Element objednavka skončil dřív, než přišla povinná polozka. Parser to pozná až u uzavírací značky, proto hláška mluví o rodiči (objednavka) a o tom, že jeho obsah není úplný. Řádek v hlášce libxml2 je řádek otevírací značky rodiče.

Chybí povinný element uprostřed

Chybně
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
  <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>

Když chybí element uprostřed sekvence, parser to zjistí až u dalšího elementu, který na jeho místo nepatří. Java proto hlásí cvc-complex-type.2.4.a (neočekávaný element polozka) a libxml2 This element is not expected. Chybějící element je ten, který hláška uvádí jako očekávaný — tady zakaznik. Víc o hlášce 2.4.a na stránce neočekávaný element.

Když element opravdu může chybět

Výchozí hodnota minOccurs je 1, takže element bez tohoto atributu je povinný. Pokud schéma spravuješ ty a element je opravdu nepovinný, uprav jeho deklaraci:

objednavka.xsd
<xs:element name="zakaznik" type="xs:string" minOccurs="0"/>

Schéma od úřadu nebo obchodního partnera (EPO, ISDOC, Pohoda) ale neupravuj — druhá strana validuje proti svému. Chybějící údaj je potřeba doplnit v programu, který XML vytváří.

Jak chybu najít

  • Hledej element uvedený v One of '{…}' is expected nebo Expected is ( … ). To je ten, který chybí.
  • Když chybí víc elementů za sebou, hláška jmenuje jen první z nich. Po doplnění validuj znovu.
  • Na záložce Schéma ve validátoru vygeneruješ z XSD dokument se všemi povinnými elementy a porovnáš 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í