
package crearxmlprovinciasmunicipios;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class CrearXMLProvinciasMunicipios {

         static String[] idProvincias      = new String[52];; 
         static String[] nombreProvincias  = new String[52];;  
         
    public static void main(String[] args) {
        try {
             leerProvincias();
             leerTodosMunicipiosProvincias();
        } catch(Exception e)
        {System.out.println(e.getMessage());}

    }
    
    static void leerProvincias() throws Exception {
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new URL("http://www.aemet.es/es/eltiempo/prediccion/municipios").openStream() ,  StandardCharsets.ISO_8859_1));

             int i=0;
             boolean escribeLinea = false;
             String cadenaLeida = bufferedReader.readLine();
             
             while(cadenaLeida != null){
   
                 if (cadenaLeida.indexOf("<select class=\"form_combo_box\" name=\"p\" id=\"provincia_selector\">") >= 0)
                       escribeLinea = true; 

                 if (cadenaLeida.indexOf("</select>") >= 0)
                         escribeLinea = false;
                                       
                 if (escribeLinea){ 
                     i++;             
                     if (i>2){
                         int k = 0;
                         while (cadenaLeida.charAt(k)< 48 || cadenaLeida.charAt(k)>57)          
                            k++;    
       
                         idProvincias[i-3] = cadenaLeida.substring(k, k+2);                                                        
                         nombreProvincias[i-3] = cadenaLeida.substring(k+4, cadenaLeida.indexOf("</option>"));                                                      
                     }                
                  }
                 
                 cadenaLeida = bufferedReader.readLine();
             }    
    }       
    
    static void leerTodosMunicipiosProvincias() throws Exception {
        
        Element raiz = new Element("PROVINCIAS");
        Element provincia;
        
        for (int i=0; i<idProvincias.length; i++) {
            provincia = new Element("PROVINCIA");
            provincia.setAttribute("id_provincia", idProvincias[i]);
            //  provincia.setText(nombreProvincias[i]);
            provincia.setAttribute("nombre", nombreProvincias[i]);  
            //  System.out.println(idProvincias[i]+"     "+nombreProvincias[i]);
            leerMunicipios(idProvincias[i], provincia);
            raiz.addContent(provincia);
        }
        
        Document document = new Document(raiz); 

        Format format = Format.getPrettyFormat();
        format.setEncoding("ISO_8859_1"); 
        format.setIndent("     ");                        
        new XMLOutputter(format).output(document, new OutputStreamWriter(new FileOutputStream(new File("D:\\XMLs_creados\\municipios.xml")) , StandardCharsets.ISO_8859_1));   
        
    }   
    
        
    static void leerMunicipios(String idProvincia, Element provincia) throws Exception {
        
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new URL("http://www.aemet.es/es/eltiempo/prediccion/municipios?p="+idProvincia).openStream() ,  StandardCharsets.ISO_8859_1));


             
             Element municipios = new Element("MUNICIPIOS");
             provincia.addContent(municipios);
             Element municipio;
             
             if (Integer.parseInt(idProvincia) == 51 || Integer.parseInt(idProvincia) == 52) { 
                 municipio = new Element("MUNICIPIO");
                 switch (Integer.parseInt(idProvincia)) {
                        case 51 : municipio.setAttribute("id_municipio", "51001");
                                  municipio.setText("Ceuta");
                                  municipios.addContent(municipio);                                  
                                  break;
                        case 52 : municipio.setAttribute("id_municipio", "52001");
                                  municipio.setText("Melilla");
                                  municipios.addContent(municipio);                                  
                                  break;                                       
                    }             
             }
             else {             
                  int i=0;
                  boolean escribeLinea = false;             
                  String cadenaLeida = bufferedReader.readLine();
             
                  while(cadenaLeida != null){
   
                      if (cadenaLeida.indexOf("<select class=\"form_combo_box\" name=\"l\" id=\"localidades_selector\">") >= 0)
                            escribeLinea = true; 

                      if (cadenaLeida.indexOf("</select>") >= 0)
                              escribeLinea = false;
                                       
                      if (escribeLinea){ 
                          i++;             
                          if (i>2){
                              int k = 0;
                              while (cadenaLeida.charAt(k)< 48 || cadenaLeida.charAt(k)>57)          
                                 k++;    
                            
                                 municipio = new Element("MUNICIPIO");
                                 municipio.setAttribute("id_municipio", cadenaLeida.substring(k, k+5));
                                 municipio.setText(cadenaLeida.substring(k+7, cadenaLeida.indexOf("</option>")));
                                 municipios.addContent(municipio);                                        
                          }                
                       }
                 
                      cadenaLeida = bufferedReader.readLine();
                  }  
             }
    }
 
}
