@Override
  public void elementAttributesProcessed(String name, String nsPrefix, String nsURI)
      throws Exception {
    if (discarding != 0) return;

    super.elementAttributesProcessed(name, nsPrefix, nsURI);
  }
  @Override
  public void endElement(String name, String nsPrefix, String nsURI) throws Exception {
    if (discarding != 0) {
      --discarding;
      return;
    }

    super.endElement(name, nsPrefix, nsURI);
  }
  @Override
  public void addAttribute(String key, String nsPrefix, String nsURI, String value, String type)
      throws Exception {
    if (discarding != 0) return;

    if (XSSUtils.isBadAttribute(key) || XSSUtils.isBadAttributeValue(key, value)) {
      logger.warn("(XSS) discarding invalid attribute: " + key + ": " + value);
      return;
    }

    super.addAttribute(key, nsPrefix, nsURI, value, type);
  }
  @Override
  public void startElement(String name, String nsPrefix, String nsURI, String systemID, int lineNr)
      throws Exception {
    if (discarding == 0 && XSSUtils.isBadTag(name)) {
      discarding = 1;
      logger.warn("(XSS) discarding invalid tag: " + name);
      return;
    }

    if (discarding != 0) {
      ++discarding;
      return;
    }

    super.startElement(name, nsPrefix, nsURI, systemID, lineNr);
  }
  @Override
  public void addPCData(Reader reader, String systemID, int lineNr) throws Exception {
    if (discarding != 0) return;

    super.addPCData(reader, systemID, lineNr);
  }