cvc-complex-type.4: Attribute must appear on element

A required attribute is missing from an element.

The message, as Java reports it
cvc-complex-type.4: Attribute 'currency' must appear on element 'order'.

Why it happens

  • The attribute is declared use="required" and the document leaves it out.
  • It is there under another name or letter case.
  • Generated XML: JAXB leaves out an @XmlAttribute whose field is null.

How to fix it

Add the attribute with a valid value to the element the message names. When the XML is generated, set the field before marshalling, or give it a default.

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 The attribute is required but missing. It checks the whole document in your browser and lists every schema error with its line and column, not only the first.

Element 'order': The attribute 'currency' is required but missing.

Example

Validated against order.xsd, below.

Reports the error
<order>
  <id>A-1</id>
  <qty>1</qty>
</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>