cvc-complex-type.3.2.2: Attribute is not allowed to appear in element

An element carries an attribute its type in the schema does not declare.

The message, as Java reports it
cvc-complex-type.3.2.2: Attribute 'vat' is not allowed to appear in element 'order'.

Why it happens

  • A misspelt attribute name or a different letter case.
  • An attribute from a newer version of the format, validated against an older schema.
  • A namespaced attribute (xsi:, xml:lang) the schema doesn't allow there.

How to fix it

Remove or rename the attribute, or validate against the schema version the document was written for. If the attribute is needed, declare it in the element's type (xs:attribute, or xs:anyAttribute for open content).

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

Element 'order', attribute 'vat': The attribute 'vat' is not allowed.

Example

Validated against order.xsd, below.

Reports the error
<order currency="EUR" vat="20">
  <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>