Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package xmlwriter; import java.io.BufferedReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; /** * Esta Clase contiene un algoritmo que permite crear documentos en formato xml y guardarlos en el directorio acutal de trabajo. *@version 1.0 *@author Cristian Camilo Isaza */ //Donde se deben inicializar las variables constructor? //Para Que sirve todo lo que viene en la carpeta jdom?? solo se usa el jar necesario public class XmlWriter { /** * Variables Globales de la aplicacin. */ final static Logger LOGGER = Logger.getLogger(""); private static final BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); /** * Metodo principal que funciona como punto de entrada de la aplicacin. * @param args */ public static void main(String[] args) { // TODO code application logic here // <editor-fold defaultstate="collapsed" desc="Codigo pedido pero incompleto"> // String attribName = ""; // String attribContent = ""; // int attribNumber = 0; // System.out.print("Nmero de aributos a crear en su archivo XML: "); // attribNumber = Integer.valueOf(read.next()); // // for (int i = 0; i < attribNumber; i++) { // System.out.print("Nombre del atributo "+ i +": "); // attribName = read.next(); // // System.out.print("Digite el contenido del atributo "+ attribName +": "); // attribContent = read.next(); // // Element child = new Element(attribName).setText(attribContent); // doc.getRootElement().addContent(child); // } // </editor-fold> System.err.println("\t\tConstructor XML\n\tFundamentos de Investigacin\n\t\t26/08/2016\n"); Element root = createRoot(); Document doc = buildDocument(root); boolean saved = saveDocument(doc); String msg = saved ? "Archivo guardado con xito" : "Ocurrio un Error al guardar el archivo"; System.err.println(msg); } /** * Este mtodo es utilizado por el mtodo buildDocument para construir el documento xml de forma recursiva, agregando un nodo a la vez. * @param padre Nodo inicialmente vcio al cual se le agregara un contenido(texto plano) o bien uno o mas subelementos hijos. * @return padre Nodo que contiene uno o mas subelementos o contenido almacenado en texto plano. * */ private static Element addElementsTo(Element padre) { try { System.out.print("Nombre del nuevo elemento que ser anidado en <" + padre.getName() + ">: "); String elementName = read.readLine(); elementName = validateElementName(elementName); Element newElement = new Element(elementName); String continua; do { System.out.print("Desea agregar ms elementos hijos a <" + elementName + ">?\ts/n: "); continua = read.readLine().trim().toLowerCase(); if ("s".equals(continua)) { addElementsTo(newElement); } else if ("n".equals(continua)) { int numHijos = newElement.getChildren().size(); if (numHijos == 0) { System.out.print("Digite el contenido del elemento <" + elementName + ">:\t"); String content = read.readLine(); newElement.setText(content); } } else { System.err.println( "Porfavor elija una opcin vlida, para ello digite 's' para elegir S o 'n' para elejir No."); continua = "s"; } } while (continua.equals("s")); padre.addContent(newElement); return padre; } catch (IOException ex) { Logger.getLogger(XmlWriter.class.getName()).log(Level.SEVERE, "Error de Entrada/Salida - addElemensTo", ex); return null; } } /** * Es usado para crear el Nodo raiz del documento xml. * @return root Retorna el elemento raiz del documento. */ private static Element createRoot() { try { System.out.print("Ingrese el nombre del elemento raz: "); String strRoot = read.readLine(); strRoot = validateElementName(strRoot); return (new Element(strRoot)); } catch (IOException ex) { Logger.getLogger(XmlWriter.class.getName()).log(Level.SEVERE, "Error de Entrada/Salida - createRoot", ex); return null; } } /** * Crea un documento y comienza el algoritmo recursivo addElements que construye el documento de nodo en nodo. * @param root Elemento que ser usado como raiz del documento. * @return Document documento xml formado despus de la interaccion con el usuario. */ private static Document buildDocument(Element root) { Document doc = new Document(addElementsTo(root)); return doc; } /** * Es usado para leer el nombre de el archivo que posteriormente ser escrito en un archivo con extension .xml * @param doc Documento Generado despues de la interaccion con el usuario y que ser escrito en un archivo con extension xml. * @return booleano que indica si encontraron errores al momento de escribir el archivo en el disco. Devuelve true si el archivo se guardo con exito y false de lo contrario. */ private static boolean saveDocument(Document doc) { try { String fileName = ""; System.out.print("Nombre del archivo XML (sin la extensin): "); fileName = read.readLine(); XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(doc, new FileWriter(fileName + ".xml")); return (true); } catch (IOException ex) { Logger.getLogger(XmlWriter.class.getName()).log(Level.SEVERE, "Error al escribir el archivo - saveDocument", ex); return (false); } } /** * Este mtodo es usado para validar y corregir el nombre que ser usado como nombre del atributo, * para lo cual reemplaza los espacios por el caracter underline y transforma dicho nombre en mayusculas. * @param candidateName Nombre ingresado por el usuario y que es candidato a ser el nombre de un atributo. ej: "nombre de atributo" * @return Nombre bien formado. ej: <PRE> "NOMBRE_DE_ATRIBUTO" </PRE> */ private static String validateElementName(String candidateName) { String correctName = candidateName.replace(" ", "_"); correctName = correctName.toUpperCase(); return correctName; } }