package ejemplos;
import java.io.File;
/*Este ejemplo es para crear una tabla en una BBDD a partir de un archivo
XML con estructura regular es decir
<raiz>
<nodo>
<campo1>dato1</campo1>
<campo2>dato2</campo2>
....
</nodo>
*
</raiz>
Pudiendo haber tantos nodos y campos como se quiera pero siempre y cuando tengan el mismo número de
<campo> y con la misma estructura, no puede haber comentarios y tiene que tener los saltos de línea
correspondientes.
*
En este archivo se recoge información acerca de los <nodo> y de los <campo> para luego
pasarselo a otra clase que es la que tiene todo lo relacionado con la BBDD. El nombre
de la tabla a crear será el equivalente a <nodo>
*
Se llamará tambien a otra clase que utiliza sax para coger el contenido,
habrá que pasarle parte de los datos recopilados aquí
/
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Ejemplos_06_DOMSAX_1_CrearTabla {
int contadorNodos=0;
/ Va a contar los nodos para saber cuantos campos necesitamos, y crear un array
con esas dimensiones. Se va a usar únicamente en la primera pasada*/
String campos[];
//Array para guardar los nombres de los nodos que serán los nombres de los campos
//en la tabla de la BBDD
int posicion=0;
//Va a ser el índice del array al ir metiendo los nombres de los campos
int pasada=1;
//indicará si estamos en la primera pasada o en la segunda
String nombreTabla;
//Recogerá el nombre del nodo para crear una tabla con dicho nombre.
File archivoXML=new File("d:\libros2.xml");
public static void main(String[] args)
{
//llamamos al constructor de la propia clase
new Ejemplos_06_DOMSAX_1_CrearTabla();
}
public Ejemplos_06_DOMSAX_1_CrearTabla(){
try{
//Se habilita un parseador de XML:
DocumentBuilderFactory objetoFactory=DocumentBuilderFactory.newInstance();
//Se instancia el DocumentBuilder a través del parseador, para construir luego el objeto Document:
DocumentBuilder objetoBuilder=objetoFactory.newDocumentBuilder();
//Una vez instanciado el DocumentBuilder iniciamos el parseo llamando al método parse,
//al que hay que pasarle como parámetro la ruta completa o relativa al fichero que queramos parsear.
//Como resultado nos devolverá un objeto Document que es un árbol DOM.
Document arbolDOM=objetoBuilder.parse(archivoXML);
//Devuelve todos los nodos del arbol, es decir el arbol entero.
NodeList lista=arbolDOM.getChildNodes();
nombreTabla=lista.item(1).getChildNodes().item(1).getNodeName();
//Cogemos el nombre de la tabla, como sabemos que nodo es lo hacemos directamente.
//Hay que ver si tiene o no comentario, y en funcion de ello cambiar el valor de los item.
//Recuerda que si tiene comentarios no funcionara.
System.out.println("La tabla es: "+nombreTabla);
/*La primera vez recorremos el xml para recoger información sobre la cantidad de nodos
que hay, para luego crear un array con esas dimensiones/
//Primera pasada
recorrerNodo(lista.item(1).getChildNodes().item(1).getChildNodes());
//Una vez recorrido el xml creamos un array con el número de nodos que hay, y luego en la
//segunda pasada llenaremos el array con los nombres de los nodos que luego a su vez serán los nombres
//de los campos de la tabla
campos=new String[contadorNodos];
//Decimos que vamos a hacer la segunda pasada
pasada=2;
//SEGUNDA PASADA
recorrerNodo(lista.item(1).getChildNodes().item(1).getChildNodes());
}//fin del try
catch(IOException e){e.printStackTrace();}
catch(ParserConfigurationException e){e.printStackTrace();}
catch(SAXException e){e.printStackTrace();}
}//Fin de creartabla
public void recorrerNodo(NodeList listaNodos){
int i=0;//Se inicia el recorrido por la lista
while(i<listaNodos.getLength()){
if(listaNodos.item(i).getNodeType()!=Node.TEXT_NODE){
//Solo queremos los nodos que no son de texto
contadorNodos++;
if(pasada==2){
//En la segunda pasada entrará aquí.
campos[posicion]=listaNodos.item(i).getNodeName();
posicion++;
}
}
i++;
}//fin del while
/*cuando hemos hecho la segunda pasada ya hemos recabado la información y hemos
* guardado en el array lo necesario, llamaremos luego al método crearTabla
* a su vez a los métodos necesarios para crear la tabla pasándole los datos recopilados aquí*/
if(pasada==2) crearTabla();
}
public void crearTabla(){
Ejemplo_06_DOMSAX_2_BBDD objetoTabla=new Ejemplo_06_DOMSAX_2_BBDD();
objetoTabla.setNombreTabla(nombreTabla);
objetoTabla.setCampos(campos);
objetoTabla.setConexion();
objetoTabla.setCrearTabla();
//Una vez hehco esto se ha creado una tabla en la BBDD con el nombre <nodo> y los nombres
//de los campos serán <campo1>, <campo2>.....
//A continuación habrá que llamar al método que inserta los datos en la tabla, eso se hará con SAX
new Ejemplo_06_DOMSAX_3_InsertarDatos(archivoXML, posicion, nombreTabla);
}
}//Fin de la clase