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:
<?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> Příčiny a opravy
Chybí povinný element na konci
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
<cislo>2026-117</cislo>
<zakaznik>Jana Nováková</zakaznik>
</objednavka> <?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
<?xml version="1.0" encoding="UTF-8"?>
<objednavka>
<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>
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:
<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
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) — počty výskytů, sekvence a výběry.
- cvc-complex-type.2.4.a — element navíc nebo ve špatném pořadí.
- XML pro finanční úřad — validace podání pro EPO.
- Přehled všech chybových hlášek.