Friday, December 13, 2013

XML DOM y SAX

// Autor: Juan Antonio Ripoll
// Fecha: 09/10/13

/*
 * Objetivo
 * 
 * REALIZA UN PROGRAMA EN JAVA (UTILIZANDO DOM) QUE CREE UN FICHERO XML 
   DONDE SE ALMACENE LA INFORMACIÓN DE LOS LIBROS DE UNA BIBLIOTECA. 
   (TITULO, AUTOR, ISBN,AÑO PUBLICACIÓN, EDITORIAL, NÚMERO DE PÁGINAS). 
	
   OPCIÓN 1.- INSERTAR LIBRO. 
   OPCIÓN 2.- ACTULIZAR INFORMACIÓN (AQUI GENERA EL XML). 
   OPCIÓN 3.- VISUALIZAR LIBROS MEDIANTE DOM. 
   OPCIÓN 4.- VISUALIZAR LIBROS MEDIANTE SAX. 
   OPCIÓN 5.- SALIR 
   
   AYUDA.- PODEÍS UTILIZAR UN FICHERO PARA GUARDAR LA INFORMACIÓN AL 
   INSERTAR LIBROS (DE CARÁCTERES, ALEATORIO O DE OBJETOS COMO OS RESULTE 
   MAS FÁCIL). Y MEDIANTE DOM LEER ESA INFORMACIÓN Y VOLCARLA EN UN XML QUE 
   SERÍA LA OPCIÓN 2. OPCIONES 3 Y 4 RECORRER EL XML VISUALIZANDOLO. 
 * */

package ad_practica2_ejercicio2;

import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.w3c.dom.Node;

public class Main 
{
	private static final String LISTADO_LIBROS = "biblioteca.dat";
	private static final String LISTADO_LIBROS_XML = "biblioteca.xml";
	
	public static void main(String[] args) throws NumberFormatException, IOException 
	{
		boolean exit = false;

		do
		{
			DibujarMenu();
			
			switch(getOpcion())
			{
				case 1: 
					InsertarLibros(); 
					break;
				case 2:  
					ActualizarInformacion();
					break;
				case 3: 
					VisualizarDOM();
					break;
				case 4:
					VisualizarSAX();
					break;
				case 5:
					exit = true; 
					break;
			}
		}
		while(!exit);

		System.out.println("Bye!");	
	}
	
	
	/*
	 * Dibuja el menú de opciones de usuario en pantalla
	 * */
	private static void DibujarMenu()
	{
		System.out.println("1.- INSERTAR LIBRO");
		System.out.println("2.- ACTUALIZAR INFORMACIÓN");
		System.out.println("3.- VISUALIZAR LIBROS MEDIANTE DOM.");
		System.out.println("4.- VISUALIZAR LIBROS MEDIANTE SAX.");
		System.out.println("5.- SALIR.");
		
		System.out.println();
	}
	
	
	/*
	 * Optiene la opción que introduce el usuario.
	 * */
	private static int getOpcion() throws NumberFormatException, IOException
	{
		System.out.print("Introduzca una opción: ");	
		
		try
		{
			BufferedReader in = new BufferedReader( new InputStreamReader( System.in ));
			return Integer.parseInt(in.readLine());
		}
		catch(Exception e)
		{
			System.out.println("Opción no reconocida por el sistema. Opciones validas [1-5].");
			System.out.println();
			
			return 0;
		}
	}

	
	/*
	 * Guarda un libro en el registro
	 * */
	private static void InsertarLibros()
	{
		if (ExisteFichero(LISTADO_LIBROS)) 
			ActualizaBiblioteca();			
		else 
			CrearBiblioteca();
	}
	
	
	/*
	 * Comprueba si existe un fichero en disco
	 * */
	private static boolean ExisteFichero(String f)
	{
    	try
    	{
    		File fichero = new File(f);
	    	
	    	if (fichero.exists())
	    		return true;
	    	
	    	return false;	
    	}
    	catch (Exception e)
    	{
    		return false;
    	}
    }
	
	
	/*
	 * Crea la biblioteca de libros y inserta el primer libro con cabezera. 
	 * */
	private static void CrearBiblioteca()
	{
		try
		{
			Libro libro = getLibro();
	        	
			if (libro != null)
			{
				ObjectOutputStream o = new ObjectOutputStream(
						new FileOutputStream(LISTADO_LIBROS));
	            
				o.writeObject(libro);
	            
				o.close();
				
				System.out.println("\nLibro insertado correctamente en la biblioteca.\n");
			}
	     } 
	     catch (Exception e)
	     {
	    	 System.out.println("Error, intentado crear la biblioteca.");
	     }
	}
	    
	    
	/*
	 * Actualiza la biblioteca de libros, obtiene un nuevo libro y lo incluye sin cabezera.	 
	 * */
	private static void ActualizaBiblioteca()
	{
		try
	    {
			Libro libro = getLibro();
			
			if (libro != null)
			{
			
				MiObjectOutputStream o = new MiObjectOutputStream(
						new FileOutputStream(LISTADO_LIBROS,true));
	         
				o.writeUnshared(libro);
	          
				o.close();
				
				System.out.println("\nLibro insertado correctamente en la biblioteca.\n");
			}
	    } 
	    catch (Exception e)
	    {
	    	System.out.println("Error, intentado añadir un nuevo libro a la biblioteca.");
	    }
	}
	
	
	/*
	 * Lee todo el listado y lo almacena en una lista de libros.
	 * */
	private static ArrayList LeerBiblioteca() 
	{
		ArrayList biblioteca = new ArrayList();
	    	
	    try
	    {
	    	ObjectInputStream o = new ObjectInputStream(
	    			new FileInputStream(LISTADO_LIBROS));
	               
	        Libro libro = (Libro)o.readObject();
	            
	        while (libro!=null)
	        {
	        	biblioteca.add(libro);
	        	
	        	libro = (Libro)o.readObject();
	        }
	            
	        o.close();
	            
	        return biblioteca;
	    }
	    catch (EOFException ex1)
	    {
	    	return biblioteca;
	    }
	    catch (Exception ex2)
	    {
	        return biblioteca;
	    }
	}
	
	
	/*
	 * Obtiene el libro que introduce el usuario. 
	 * */
	private static Libro getLibro()
	{
		try
		{
			BufferedReader reader = new BufferedReader(
					new InputStreamReader(System.in));
			
			Libro libro = new Libro();
			
			System.out.print("Título: ");
			libro.setTitulo(reader.readLine());
	
			System.out.print("Autor: ");
			libro.setAutor(reader.readLine());
			
			System.out.print("ISBN: ");
			libro.setIsbn(reader.readLine());
	
			System.out.print("Año de publicación: ");
			libro.setAnyo_publicacion(Integer.parseInt(reader.readLine()));
			
			System.out.print("Editorial: ");
			libro.setEditorial(reader.readLine());
			
			System.out.print("Número de páginas: ");
			libro.setNumero_paginas(Integer.parseInt(reader.readLine()));

			return libro;
		}
		catch (Exception e){
			System.out.println("\nError en la recogida de datos del libro.\nEl año de publicación y el número de páginas deben de ser números.\n");
			return null;
		}
	}
	
	
	
	/*
	 * Actualiza todo el listado de libros en un fichero XML "biblioteca.xml" mediante DOM.
	 * */
	private static void ActualizarInformacion()
	{
		
		ArrayList biblioteca = LeerBiblioteca();
		
		if (biblioteca.size() == 0)
		{
			System.out.println("\nNo existe ningún libro.\nInserte algún libro antes actualizar la información.\n");	
		}
		else
		{
			try
			{
				DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
				DocumentBuilder db = df.newDocumentBuilder();
				Document doc = db.newDocument();		 
				 
				Element nodo_biblioteca = doc.createElement("biblioteca");
				doc.appendChild(nodo_biblioteca);
			 	
				
				for (Libro libro : biblioteca) 
				{
					Element nodo_libro = doc.createElement("libro"); 
					nodo_biblioteca.appendChild(nodo_libro);
						 
					Attr attr = doc.createAttribute("isbn");
					attr.setValue(libro.getIsbn());
					nodo_libro.setAttributeNode(attr);
					
					CrearElemento("titulo", libro.getTitulo(), nodo_libro, doc);
					CrearElemento("autor", libro.getAutor(), nodo_libro, doc);
					CrearElemento("año_publicacion", Integer.toString(libro.getAnyo_publicacion()), nodo_libro, doc);
					CrearElemento("editorial", libro.getEditorial(), nodo_libro, doc);
					CrearElemento("numero_paginas", Integer.toString(libro.getNumero_paginas()), nodo_libro, doc);
				}
					
				TransformerFactory transformerFactory = TransformerFactory.newInstance();
				Transformer transformer = transformerFactory.newTransformer();
				DOMSource source = new DOMSource(doc);
				StreamResult result = new StreamResult(new File("biblioteca.xml"));
			 
				transformer.transform(source, result);
				
				System.out.println("\nInformación actualizada con éxito.\nSe a creado el archivo biblioteca.xml con todos los libros disponibles.\n");
			}
			catch (ParserConfigurationException pce) 
			{ 
				pce.printStackTrace(); 
			} 
			catch (TransformerException tfe) 
			{ 
				tfe.printStackTrace(); 
			}
		}
	}
	

    private static void CrearElemento(String dato, String valor, Element raiz, Document document)
    {
        Element elem=document.createElement(dato);
        Text text = document.createTextNode(valor);
        raiz.appendChild(elem);
        elem.appendChild(text);
    }

	

    /*
     * Visualiza el fichero xml mediante DOM.
     * */
    private static void VisualizarDOM()
    {
    	if (!ExisteFichero(LISTADO_LIBROS_XML))
    	{
    		System.out.println("\nEl fichero XML no existe.\nActualize la información de los libros antes de visualizarlos.\n");
    	}
    	else
    	{
	    	try 
	    	{	 
	    		File fXmlFile = new File("biblioteca.xml");
	    		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	    		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
	    		Document doc = dBuilder.parse(fXmlFile);
	    	 
	    		
	    		doc.getDocumentElement().normalize();
	    	  
	    		NodeList nList = doc.getElementsByTagName("libro");
	    	 
	    		
	    		System.out.println("\n---------------------------------");
	    		System.out.println("Lectura de libros mediante DOM.");
	    		System.out.println("---------------------------------\n");
	    		
	    		for (int i=0; i' tags  
				public void characters(char ch[], int start, int length)  throws SAXException 
				{  	
					if (titulo.equals("open")) 
						System.out.println("Título: " + new String(ch, start, length));  
					
					if (autor.equals("open")) 
						System.out.println("Autor: " + new String(ch, start, length));  
					
					if (año_publicacion.equals("open")) 
						System.out.println("Año de publicación: " + new String(ch, start, length));  
					
					if (editorial.equals("open")) 
						System.out.println("Editorial: " + new String(ch, start, length));  
				
					if (numero_paginas.equals("open")) 
						System.out.println("Número de páginas: " + new String(ch, start, length) + "\n");  
				}  
  
				// calls by the parser whenever '>' end tag is found in xml   
				// makes tags flag to 'close'  
				public void endElement(String uri, String localName, String qName) throws SAXException 
				{  
					if (qName.equalsIgnoreCase("TITULO")) 
						titulo = "close";  
					
					if (qName.equalsIgnoreCase("AUTOR")) 
						autor = "close";  
     
					if (qName.equalsIgnoreCase("AÑO_PUBLICACION")) 
						año_publicacion = "close";  
     
					if (qName.equalsIgnoreCase("EDITORIAL")) 
						editorial = "close";  
					
					if (qName.equalsIgnoreCase("NUMERO_PAGINAS")) 
						numero_paginas = "close";  
				}  
			};  
     
			saxParser.parse("biblioteca.xml", defaultHandler);  
		} 
		catch (Exception e) 
		{  
			e.printStackTrace();  
		}  
	}  
}  

package ad_practica2_ejercicio2;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class MiObjectOutputStream extends ObjectOutputStream
{
    /** Constructor que recibe OutputStream */
    public MiObjectOutputStream(OutputStream out) throws IOException
    {
        super(out);
    }

    /** Constructor sin parámetros */
    protected MiObjectOutputStream() throws IOException, SecurityException
    {
        super();
    }

    /** Redefinición del método de escribir la cabecera para que no haga nada. */
    protected void writeStreamHeader() throws IOException
    {
    	
    }
}

package ad_practica2_ejercicio2;

import java.io.Serializable;

public class Libro implements Serializable 
{	
	private static final long serialVersionUID = 1L;
	
	private String titulo;
	private String autor;
	private String isbn;
	private int anyo_publicacion;
	private String editorial;
	private int numero_paginas;
	
	public Libro (String titulo, String autor, String isbn, int anyo_publicacion, String editorial, int numero_paginas)
	{
		this.setTitulo(titulo);
		this.setAutor(autor);
		this.setIsbn(isbn);
		this.setAnyo_publicacion(anyo_publicacion);
		this.setEditorial(editorial);
		this.setNumero_paginas(numero_paginas);
	}
	
	public Libro ()
	{	
		this.setTitulo(null);
		this.setAutor(null);
		this.setIsbn(null);
		this.setAnyo_publicacion(0);
		this.setEditorial(null);
		this.setNumero_paginas(0);
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getAutor() {
		return autor;
	}

	public void setAutor(String autor) {
		this.autor = autor;
	}

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	public int getAnyo_publicacion() {
		return anyo_publicacion;
	}

	public void setAnyo_publicacion(int anyo_publicacion) {
		this.anyo_publicacion = anyo_publicacion;
	}

	public String getEditorial() {
		return editorial;
	}

	public void setEditorial(String editorial) {
		this.editorial = editorial;
	}

	public int getNumero_paginas() {
		return numero_paginas;
	}

	public void setNumero_paginas(int numero_paginas) {
		this.numero_paginas = numero_paginas;
	}	
}

No comments:

Post a Comment