@Override
  public void startElement(final String namespaceURI, String localName,
                           final String qName, final Attributes atts) throws SAXException {
    if (suppress) {
      return;
    }

    String prefix = "";

    // If QName is set, then set prefix and local name as necessary
    if (!"".equals(qName)) {
      final int colon = qName.indexOf(':');

      if (colon > 0) {
        prefix = qName.substring(0, colon);
      }

      // If local name is not set, try to get it from the QName
      if ((localName == null) || (localName.isEmpty())) {
        localName = qName.substring(colon + 1);
      }
    }
    // At this point either prefix and localName are set correctly or
    // there is an error in the parser.

    final Namespace namespace = Namespace
      .getNamespace(prefix, namespaceURI);
    final Element element = currentLocator == null ? factory.element(
      localName, namespace) : factory.element(
      currentLocator.getLineNumber(),
      currentLocator.getColumnNumber(), localName, namespace);

    // Take leftover declared namespaces and add them to this element's
    // map of namespaces
    if (declaredNamespaces.size() > 0) {
      transferNamespaces(element);
    }

    flushCharacters();

    if (atRoot) {
      factory.setRoot(currentDocument, element); // Yes, use a factory
      // call...
      atRoot = false;
    }
    else {
      factory.addContent(getCurrentElement(), element);
    }
    currentElement = element;

    // Handle attributes
    for (int i = 0, len = atts.getLength(); i < len; i++) {

      String attPrefix = "";
      String attLocalName = atts.getLocalName(i);
      final String attQName = atts.getQName(i);
      final boolean specified = !(atts instanceof Attributes2) || ((Attributes2)atts).isSpecified(i);

      // If attribute QName is set, then set attribute prefix and
      // attribute local name as necessary
      if (!attQName.isEmpty()) {
        // Bypass any xmlns attributes which might appear, as we got
        // them already in startPrefixMapping(). This is sometimes
        // necessary when SAXHandler is used with another source than
        // SAXBuilder, as with JDOMResult.
        if (attQName.startsWith("xmlns:") || attQName.equals("xmlns")) {
          continue;
        }

        final int attColon = attQName.indexOf(':');

        if (attColon > 0) {
          attPrefix = attQName.substring(0, attColon);
        }

        // If localName is not set, try to get it from the QName
        if ("".equals(attLocalName)) {
          attLocalName = attQName.substring(attColon + 1);
        }
      }

      final AttributeType attType = AttributeType.getAttributeType(atts
                                                                     .getType(i));
      final String attValue = atts.getValue(i);
      final String attURI = atts.getURI(i);

      if (XMLConstants.XMLNS_ATTRIBUTE.equals(attLocalName)
          || XMLConstants.XMLNS_ATTRIBUTE.equals(attPrefix)
          || XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attURI)) {
        // use the actual Namespace to check too, because, in theory, a
        // namespace-aware parser does not need to set the qName unless
        // the namespace-prefixes feature is set as well.
        continue;
      }
      // At this point either attPrefix and attLocalName are set
      // correctly or there is an error in the parser.

      // just one thing to sort out....
      // the prefix for the namespace.
      if (!"".equals(attURI) && attPrefix.isEmpty()) {
        // the localname and qName are the same, but there is a
        // Namspace URI. We need to figure out the namespace prefix.
        // this is an unusual condition. Currently the only known
        // trigger
        // is when there is a fixed/defaulted attribute from a
        // validating
        // XMLSchema, and the attribute is in a different namespace
        // than the rest of the document, this happens whenever there
        // is an attribute definition that has form="qualified".
        // <xs:attribute name="attname" form="qualified" ... />
        // or the schema sets attributeFormDefault="qualified"
        final HashMap<String, Namespace> tmpmap = new HashMap<>();
        for (final Namespace nss : element.getNamespacesInScope()) {
          if (nss.getPrefix().length() > 0
              && nss.getURI().equals(attURI)) {
            attPrefix = nss.getPrefix();
            break;
          }
          tmpmap.put(nss.getPrefix(), nss);
        }

        if (attPrefix.isEmpty()) {
          // we cannot find a 'prevailing' namespace that has a prefix
          // that is for this namespace.
          // This basically means that there's an XMLSchema, for the
          // DEFAULT namespace, and there's a defaulted/fixed
          // attribute definition in the XMLSchema that's targeted
          // for this namespace,... but, the user has either not
          // declared a prefixed version of the namespace, or has
          // re-declared the same prefix at a lower level with a
          // different namespace.
          // All of these things are possible.
          // Create some sort of default prefix.
          int cnt = 0;
          final String base = "attns";
          String pfx = base + cnt;
          while (tmpmap.containsKey(pfx)) {
            cnt++;
            pfx = base + cnt;
          }
          attPrefix = pfx;
        }
      }
      final Namespace attNs = Namespace.getNamespace(attPrefix, attURI);

      final Attribute attribute = factory.attribute(attLocalName, attValue, attType, attNs);
      if (!specified) {
        // it is a DTD defaulted value.
        attribute.setSpecified(false);
      }
      factory.setAttribute(element, attribute);
    }
  }
@Override
  public void startElement(final String namespaceURI, String localName,
                           final String qName, final Attributes atts)