@Override
 public void startElement(
     String namespaceURI, String localName, String nombre, Attributes atributo)
     throws SAXException {
   if (nombre.equalsIgnoreCase("article")
       || nombre.equalsIgnoreCase("inproceedings")
       || nombre.equalsIgnoreCase("proceedings")
       || nombre.equalsIgnoreCase("book")
       || nombre.equalsIgnoreCase("incollection")
       || nombre.equalsIgnoreCase("phdthesis")
       || nombre.equalsIgnoreCase("mastersthesis")) {
     totalElementos++;
     if (totalElementos % 70000 == 0) {
       int porcentaje = (totalElementos * 100) / 3189809;
       Estado.reportarEstado("Cargando " + porcentaje + "% y " + totalElementos + " elementos");
       System.out.print("\b\b\b");
       if (porcentaje < 10) System.out.print(" " + porcentaje + "%");
       else System.out.print(porcentaje + "%");
     }
     conector.agregarElemento(atributo.getValue("key"));
   } else if (nombre.equalsIgnoreCase("title")) {
     conector.iniciarSubElemento(Conector.Titilo);
   } else if (nombre.equalsIgnoreCase("author") || nombre.equalsIgnoreCase("editor")) {
     conector.iniciarSubElemento(Conector.Autor);
   } else if (nombre.equalsIgnoreCase("year")) {
     conector.iniciarSubElemento(Conector.Año);
   }
 }
 @Override
 public void characters(char[] caracteres, int inicio, int largo) throws SAXException {
   if (conector.definiendoSubElemento() == Conector.Titilo
       || conector.definiendoSubElemento() == Conector.Autor
       || conector.definiendoSubElemento() == Conector.Año) {
     conector.agregarSubElemento(new String(caracteres, inicio, largo));
   }
 }
 @Override
 public void endElement(String namespaceURI, String localName, String rawName)
     throws SAXException {
   if (rawName.equalsIgnoreCase("article")
       || rawName.equalsIgnoreCase("inproceedings")
       || rawName.equalsIgnoreCase("proceedings")
       || rawName.equalsIgnoreCase("book")
       || rawName.equalsIgnoreCase("incollection")
       || rawName.equalsIgnoreCase("phdthesis")
       || rawName.equalsIgnoreCase("mastersthesis")) {
     conector.finalizarElemento();
   } else if (rawName.equalsIgnoreCase("title")
       || rawName.equalsIgnoreCase("author")
       || rawName.equalsIgnoreCase("editor")
       || rawName.equalsIgnoreCase("year")) {
     conector.finalizarSubElemento();
   }
 }
public class GestorDeConfiguracion extends DefaultHandler {
  private Conector conector = Conector.IniciarConexion();
  private int totalElementos = 0;

  @Override
  public void startElement(
      String namespaceURI, String localName, String nombre, Attributes atributo)
      throws SAXException {
    if (nombre.equalsIgnoreCase("article")
        || nombre.equalsIgnoreCase("inproceedings")
        || nombre.equalsIgnoreCase("proceedings")
        || nombre.equalsIgnoreCase("book")
        || nombre.equalsIgnoreCase("incollection")
        || nombre.equalsIgnoreCase("phdthesis")
        || nombre.equalsIgnoreCase("mastersthesis")) {
      totalElementos++;
      if (totalElementos % 70000 == 0) {
        int porcentaje = (totalElementos * 100) / 3189809;
        Estado.reportarEstado("Cargando " + porcentaje + "% y " + totalElementos + " elementos");
        System.out.print("\b\b\b");
        if (porcentaje < 10) System.out.print(" " + porcentaje + "%");
        else System.out.print(porcentaje + "%");
      }
      conector.agregarElemento(atributo.getValue("key"));
    } else if (nombre.equalsIgnoreCase("title")) {
      conector.iniciarSubElemento(Conector.Titilo);
    } else if (nombre.equalsIgnoreCase("author") || nombre.equalsIgnoreCase("editor")) {
      conector.iniciarSubElemento(Conector.Autor);
    } else if (nombre.equalsIgnoreCase("year")) {
      conector.iniciarSubElemento(Conector.Año);
    }
  }

  @Override
  public void endElement(String namespaceURI, String localName, String rawName)
      throws SAXException {
    if (rawName.equalsIgnoreCase("article")
        || rawName.equalsIgnoreCase("inproceedings")
        || rawName.equalsIgnoreCase("proceedings")
        || rawName.equalsIgnoreCase("book")
        || rawName.equalsIgnoreCase("incollection")
        || rawName.equalsIgnoreCase("phdthesis")
        || rawName.equalsIgnoreCase("mastersthesis")) {
      conector.finalizarElemento();
    } else if (rawName.equalsIgnoreCase("title")
        || rawName.equalsIgnoreCase("author")
        || rawName.equalsIgnoreCase("editor")
        || rawName.equalsIgnoreCase("year")) {
      conector.finalizarSubElemento();
    }
  }

  @Override
  public void characters(char[] caracteres, int inicio, int largo) throws SAXException {
    if (conector.definiendoSubElemento() == Conector.Titilo
        || conector.definiendoSubElemento() == Conector.Autor
        || conector.definiendoSubElemento() == Conector.Año) {
      conector.agregarSubElemento(new String(caracteres, inicio, largo));
    }
  }

  @Override
  public void warning(SAXParseException exception) throws SAXException {
    Mensaje("Advertencia\n", exception);
    throw new SAXException("Advertencia");
  }

  @Override
  public void error(SAXParseException exception) throws SAXException {
    Mensaje("Error en el analisis\n", exception);
    throw new SAXException("Error");
  }

  @Override
  public void fatalError(SAXParseException exception) throws SAXException {
    Mensaje("Error fatal en el analisis\n", exception);
    throw new SAXException("Error Fatal");
  }

  private void Mensaje(String tipo, SAXParseException excepcion) {
    System.out.println(
        tipo
            + " Linea: "
            + excepcion.getLineNumber()
            + " URI: "
            + excepcion.getSystemId()
            + "\n"
            + " Mensaje: "
            + excepcion.getMessage());
  }
}