@Override
  public void canContainContent(Content child, int index, boolean replace) {
    if (child instanceof Element) {
      int cre = content.indexOfFirstElement();
      if (replace && cre == index) {
        return;
      }
      if (cre >= 0) {
        throw new IllegalAddException(
          "Cannot add a second root element, only one is allowed");
      }
      if (content.indexOfDocType() >= index) {
        throw new IllegalAddException(
          "A root element cannot be added before the DocType");
      }
    }
    if (child instanceof DocType) {
      int cdt = content.indexOfDocType();
      if (replace && cdt == index) {
        // It's OK to replace an existing DocType
        return;
      }
      if (cdt >= 0) {
        throw new IllegalAddException(
          "Cannot add a second doctype, only one is allowed");
      }
      int firstElt = content.indexOfFirstElement();
      if (firstElt != -1 && firstElt < index) {
        throw new IllegalAddException(
          "A DocType cannot be added after the root element");
      }
    }

    if (child instanceof CDATA) {
      throw new IllegalAddException("A CDATA is not allowed at the document root");
    }

    if (child instanceof Text) {
      if (Verifier.isAllXMLWhitespace(((Text)child).getText())) {
        // only whitespace, not a problem.
        return;
      }
      throw new IllegalAddException("A Text is not allowed at the document root");
    }

    if (child instanceof EntityRef) {
      throw new IllegalAddException("An EntityRef is not allowed at the document root");
    }
  }
@Override
  public void canContainContent(Content child, int index, boolean replace)