E-Rechnung Validator
Validierungsfehler

Die Datei verstößt gegen das XML-Schema (MUSTANG-SCHEMA)

Einer der häufigsten Gründe, warum eine E-Rechnung die Prüfung nicht besteht. Die Datei ist als XML lesbar, passt aber nicht zum Bauplan, den das XML-Schema (XSD) für UBL- und CII-Rechnungen vorschreibt: Ein Element fehlt oder steht an der falschen Stelle, ein Pflichtattribut fehlt, oder ein Wert hat das falsche Format. Solange das Schema verletzt ist, prüft der KoSIT-Validator die Geschäftsregeln (Schematron) gar nicht — nach der Korrektur können deshalb weitere Meldungen erscheinen. Eine Stufe davor scheitern Dateien, die gar nicht als XML lesbar sind; auch dieser Fall ist unten beschrieben.

Was bedeutet dieser Fehler?

Regeltext der Prüf-Engine

cvc-complex-type.2.4.a: Ungültiger Content wurde beginnend mit Element '…' gefunden. '…' wird erwartet.

Zwei Prüfer können einen Schemafehler melden, und die Meldungen sehen verschieden aus. Der KoSIT-Validator führt den cvc-Code als Regelkennung, darunter steht der deutsche Wortlaut als Originalmeldung. Eine Fundstelle zeigen wir dazu nicht an; das betroffene Element und der Wert stehen in der Meldung. Mustang, das nur urteilt, wenn KoSIT für die Datei kein Prüfszenario hat oder nicht antwortet, beginnt mit „schema validation fails“, nennt Zeile und Spalte (lineNumber, columnNumber) im Text und danach den cvc-Code. In beiden Fällen bestimmt der cvc-Code, wie der Rest zu lesen ist.

Die langen Angaben in geschweiften Klammern sind nur der Namensraum. Es zählt der Name dahinter: Aus {"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":IssueDate} wird cbc:IssueDate.

cvc-complex-type.2.4.a — An dieser Stelle steht ein Element, das dort nicht hingehört. Die Meldung nennt es und dahinter die Elemente, die an dieser Stelle zulässig wären.

cvc-complex-type.2.4.b — Ein Abschnitt endet, bevor alle Pflichtelemente da sind. Die Meldung nennt den Abschnitt, etwa cac:LegalMonetaryTotal, und was noch erwartet wird.

cvc-complex-type.4 — Ein Pflichtattribut fehlt, typischerweise currencyID an einem Betrag. Der KoSIT-Validator meldet das als „Attribut 'currencyID' muss in Element 'cbc:PayableAmount' vorkommen.“

cvc-datatype-valid.1.2.1 — Ein Wert passt nicht zu seinem Typ. Die Meldung zitiert ihn wörtlich, etwa „'1190,00' ist kein gültiger Wert für 'decimal'“.

cvc-complex-type.2.2 — Beim KoSIT-Validator folgt auf cvc-datatype-valid.1.2.1 an derselben Stelle jedes Mal eine zweite Meldung: „Element 'cbc:PayableAmount' darf kein Element [untergeordnete Elemente] haben, und der Wert muss gültig sein.“ Gemeint ist derselbe Mangel; ist der Wert korrigiert, sind beide Meldungen weg.

cvc-elt.1.a — Das Wurzelelement wird nicht erkannt: Es trägt zwar den richtigen Namen, etwa Invoice, steht aber in einem falschen oder in gar keinem Namensraum. Der KoSIT-Validator findet für eine solche Datei kein Prüfszenario und meldet keinen Schemafehler; dann urteilt Mustang, und die Meldung hat dessen Form.

Bei 2.4.a nennt die Meldung nicht unbedingt das Element, um das es geht. Fehlt ein Element oder steht es zu weit hinten, beanstandet sie das nachfolgende — beide Fälle ergeben wortgleich dieselbe Meldung. Steht es zu weit vorn, beanstandet sie das verschobene Element selbst.

Der KoSIT-Validator meldete in den Messungen mehrere Verstöße auf einmal, auch an verschiedenen Stellen derselben Datei. Mustang meldet nur den ersten; nach dessen Korrektur kann der nächste erscheinen.

Ob nach einem Schemafehler noch Geschäftsregeln geprüft werden, hängt vom Prüfer ab. Der KoSIT-Validator prüft das Schematron gar nicht, solange das Schema verletzt ist: In allen gemessenen Fällen enthielt sein Bericht dann nur den Schema-Schritt, und derselbe Mangel erscheint nicht zusätzlich als Regel. Mustang prüft weiter, solange nicht irgendwo in der Datei ein Betrag oder eine Menge keine gültige Zahl ist — mit Komma, mit Tausenderpunkt oder leer. Dann läuft keine einzige Geschäftsregel, selbst wenn die Meldung einen ganz anderen Fehler nennt. Sonst erscheint der Mangel bei Mustang oft zusätzlich als Regel: Ein fehlendes cbc:ID meldet daneben BR-02, ein fehlendes currencyID BR-CL-03. Bei einem falschen Namensraum greifen die Regeln ins Leere; was dann zusätzlich erscheint, ist nicht verlässlich.

Läuft die Prüfung in englischer Sprachumgebung, lautet dieselbe Meldung „Invalid content was found starting with element …“. Der cvc-Code ist in beiden Sprachen derselbe.

Der KoSIT-Validator meldet zwar eine Zeilennummer, sie passt aber nicht zur Datei: In einer Datei, in der Mustang Zeile 7 nannte, nannte er für dieselbe Stelle Zeile 4, weil er ab dem Wurzelelement zählt. Wir zeigen sie deshalb nicht an. Such nach dem Elementnamen oder dem Wert aus der Meldung.

Beispiel

❌ FEHLERHAFT

<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#…</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:IssueDate>2026-06-18</cbc:IssueDate>

Meldung: „cvc-complex-type.2.4.a: Ungültiger Content wurde beginnend mit Element …IssueDate gefunden. …ProfileExecutionID, …ID wird erwartet.“ Nach cbc:ProfileID hätte cbc:ProfileExecutionID oder cbc:ID folgen dürfen, gekommen ist cbc:IssueDate. cbc:ID fehlt.

✓ KORREKT

<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#…</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>MM-2026-0001</cbc:ID>
<cbc:IssueDate>2026-06-18</cbc:IssueDate>

cbc:ID steht zwischen cbc:ProfileID und cbc:IssueDate. Wortgleich dieselbe Meldung erscheint übrigens, wenn cbc:ID zwar vorhanden ist, aber erst nach cbc:IssueDate steht.

Häufige Ursachen

  • Ein Pflichtelement fehlt oder steht weiter hinten als vorgeschrieben. Beide Fälle ergeben wortgleich dieselbe Meldung (cvc-complex-type.2.4.a) — such das erwartete Element erst weiter unten in der Datei, bevor du es neu einfügst.
  • Das letzte Pflichtelement eines Abschnitts fehlt, etwa cbc:PayableAmount am Ende von cac:LegalMonetaryTotal. Dann lautet die Meldung „Content des Elements … ist nicht vollständig“ (cvc-complex-type.2.4.b).
  • In UBL ein Betrag ohne Währungsattribut: <cbc:PayableAmount>1190.00</cbc:PayableAmount> statt <cbc:PayableAmount currencyID="EUR">1190.00</cbc:PayableAmount> (cvc-complex-type.4).
  • Ein Betrag oder eine Menge mit Komma oder Tausenderpunkt: „1190,00“, „1.190,00“ und „10,5“ sind kein gültiger Wert für den Typ decimal. In der XML steht immer ein Punkt als Dezimaltrenner und kein Tausendertrennzeichen, in UBL wie in CII. Solange ein solcher Wert in der Datei steht, läuft keine einzige Geschäftsregel.
  • In UBL ein Datum im deutschen Format: „18.06.2026“ ist kein gültiger Wert für den Typ date, verlangt ist JJJJ-MM-TT. In CII steht das Datum dagegen als JJJJMMTT mit format="102"; ein deutsches Datum fällt dort nicht im Schema auf, sondern als Regel CII-DT-097.
  • In UBL ein leeres Datums- oder Betragsfeld, etwa <cbc:IssueDate></cbc:IssueDate>. Ein leeres Textfeld wie <cbc:ID></cbc:ID> besteht das Schema dagegen und fällt erst bei den Geschäftsregeln auf (BR-02 und PEPPOL-EN16931-R008).
  • Ein selbst hinzugefügtes Element, etwa <cbc:Hauswaehrung>. Das Schema lässt keine eigenen Felder zu; Zusatzangaben gehören in die Bemerkung (BT-22, cbc:Note).
  • Ein falscher oder fehlender Namensraum im Wurzelelement, etwa …:Invoice-1 statt …:Invoice-2. Die Meldung lautet dann „Deklaration des Elements "Invoice" kann nicht gefunden werden“ (cvc-elt.1.a). Der KoSIT-Validator findet für eine solche Datei kein Prüfszenario; die Meldung kommt dann von Mustang.
  • Die Datei ist gar nicht als XML lesbar: ein falsch geschlossenes Tag (<cbc:ID>…</cbc:I>), eine falsche Verschachtelung, ein unsichtbares Steuerzeichen im Text oder ein unmaskiertes & in einem Namen wie „Müller & Söhne“ — in der XML muss dort Müller &amp; Söhne stehen. Endet die Datei mitten in einem Element, wurde sie beim Export oder Download abgeschnitten; dann hilft nur, sie neu zu erzeugen. Der KoSIT-Validator meldet das mit dem Satz seines XML-Parsers, der das Element nennt, etwa „Error reported by XML parser: Elementtyp "cbc:ID" muss mit dem entsprechenden Endtag "</cbc:ID>" beendet werden.“ (Code SXXP0003). Daneben steht Mustangs Diagnose „File does not look like PDF nor XML (contains neither %PDF nor <?xml)“ — auch dann, wenn die Datei mit einer XML-Deklaration beginnt. Bei uns erscheint sie als MUSTANG-FILE-TYPE, bei einem unsichtbaren Byte-Order-Mark am Dateianfang als MUSTANG-FILE-TYPE-XML-OFFSET.

So behebst du den Fehler

Schritt 1: Die Stelle in der Datei suchen

Die Meldung nennt das betroffene Element oder den Wert. Öffne die XML in einem Editor und such danach. Steht „lineNumber“ und „columnNumber“ im Text (so meldet es Mustang), geh dorthin: Dort hat der Parser den Verstoß bemerkt, die Ursache liegt an dieser Stelle oder kurz davor. Bei einer ZUGFeRD- oder Factur-X-PDF beziehen sich die Angaben auf die eingebettete XML; sie steckt im ZIP-Download unter dem Prüfergebnis.

Schritt 2: Am cvc-Code erkennen, was zu tun ist

Bei 2.4.a und 2.4.b fehlt etwas oder steht falsch, maßgeblich ist die Liste hinter „wird erwartet“. Bei cvc-complex-type.4 fehlt ein Attribut. Bei cvc-datatype-valid ist der zitierte Wert zu korrigieren. Bei cvc-elt.1.a stimmt der Namensraum im Wurzelelement nicht.

Schritt 3: Fehlende Elemente erst weiter unten suchen

Kommt das erwartete Element weiter unten in der Datei vor, ist es nur falsch einsortiert und muss nach oben. Fehlt es ganz, ist es zu ergänzen.

Schritt 4: Zahlen und Datumsangaben im XML-Format schreiben

Beträge und Mengen mit Punkt als Dezimaltrenner und ohne Tausendertrennzeichen, also 1190.00. Datumsangaben in UBL als 2026-06-18, in CII als 20260618 mit format="102".

Schritt 5: Lesbarkeit vorab prüfen

xmllint --noout rechnung.xml prüft, ob die Datei überhaupt als XML lesbar ist, und nennt bei einem Fehler Zeile und Ursache. Jeder XML-Editor kann das ebenso.

Schritt 6: Wiederkehrende Fehler an der Quelle beheben

Tritt derselbe Fehler bei jeder Rechnung auf, liegt die Ursache im Export der Rechnungssoftware. Eine Korrektur von Hand behebt den Einzelfall, nicht den nächsten.

Fehler behoben? Jetzt erneut validieren

Prüfe deine korrigierte XRechnung oder ZUGFeRD-Datei kostenlos mit dem KoSIT-Validator.