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

An element ended before all the children the schema requires appeared.

The message, as Java reports it
cvc-complex-type.2.4.b: The content of element 'order' is not complete. One of '{qty}' is expected.

Why it happens

  • A required child element is missing: its minOccurs is 1 (the default) and the document leaves it out.
  • The child is there but in another namespace, so Xerces does not count it.
  • An empty element (<order/>) where the schema expects content.

How to fix it

The message names the element that is incomplete and, in braces, what it still needs. Add the missing child at the end of that element, or make it optional in the schema (minOccurs="0") if it really is. When generating XML with JAXB, a null field is left out, so a required element with no value triggers this error.

Java's schema validation (javax.xml.validation.Validator, and JAXB or Spring on top of it) throws at the first error unless you set an ErrorHandler whose error() records the SAXParseException and carries on; each one has getLineNumber() and getColumnNumber(). A well-formedness error ends parsing whatever the handler does.

The same problem in xmlvalid

xmlvalid validates with libxml2, which reports it as Missing child element(s). It checks the whole document in your browser and lists every schema error with its line and column, not only the first.

Element 'order': Missing child element(s). Expected is ( qty ).

Example

Validated against order.xsd, below.

Reports the error
<order currency="EUR">
  <id>A-1</id>
</order>
Fixed
<order currency="EUR">
  <id>A-1</id>
  <qty>1</qty>
</order>
order.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="id" type="xs:string"/>
        <xs:element name="qty" type="xs:int"/>
        <xs:element name="status" type="Status" minOccurs="0"/>
        <xs:element name="code" type="Code" minOccurs="0"/>
        <xs:element name="note" type="Short" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="currency" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="Status">
    <xs:restriction base="xs:string">
      <xs:enumeration value="open"/>
      <xs:enumeration value="paid"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Code">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z]{3}-[0-9]{4}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Short">
    <xs:restriction base="xs:string">
      <xs:maxLength value="10"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>