cvc-complex-type.2.3: Element cannot have character [children]

Text appears directly inside an element that may only contain other elements.

The message, as Java reports it
cvc-complex-type.2.3: Element 'order' cannot have character [children], because the type's content type is element-only.

Why it happens

  • Stray text between child elements: a value typed outside its element, a leftover word.
  • A value written straight into the parent instead of into the child element meant for it.
  • Characters that look like whitespace but aren't, such as a non-breaking space, between elements.

How to fix it

Find the text directly inside the element the message names and move it into the right child, or delete it. Plain spaces and line breaks between elements are fine; anything else is not.

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 Character content other than whitespace 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': Character content other than whitespace is not allowed because the content type is 'element-only'.

Example

Validated against order.xsd, below.

Reports the error
<order currency="EUR">hello
  <id>A-1</id>
  <qty>1</qty>
</order>
Fixed
<order currency="EUR">
  <id>A-1</id>
  <qty>1</qty>
  <note>hello</note>
</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>