modificar XML

Iniciado por ryhuso, 7 Mayo 2020, 15:26 PM

0 Miembros y 1 Visitante están viendo este tema.

ryhuso

Hola necesito añadir un nodo y también modificar uno existente del cual preguntare por teclado el nombre del nodo en un archivo XML, no se muy bien como hacerlo, los ejemplos que encontré están en ingles o con datos que no entiendo de donde salen.

rub'n

Q tal que es la que hay?

Pues bien, Pon lo que llevas al menos ni idea tengo un por donde vas,

Con un fichero Properties quizá quizá, valla la cuention por ahí.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

el problema me pide que pueda modificar el fichero XML y mostrarlo por pantalla
lo que tengo hecho es solo lo de mostrar por pantalla... la opcion de modificar tiene que modificar un tipo de nodo especifico por ejem: "titulo" que tenga nombre "Colonia " cambiarlo por otro


import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import xml.Presentar;

public class Maneja {

    public static void main(String[] args) throws TransformerException, TransformerConfigurationException {
        String nodees = "";
        Scanner entrada = new Scanner(System.in);
        System.out.println("\t\tDocumentos XML");
        int opcion = 0;
        while (opcion != 5) {
            System.out.println("\t\t\t\tMenú de Opciones");
            System.out.println("\t\t\t\t================");
            System.out.println("1)Presentar XML");
            System.out.println("2)Añadir nuevo nodo");
            System.out.println("3)Modificar nodo");
            System.out.println("4)Eliminar nodo");
            System.out.println("5)Salir");
            System.out.println("================");
            try {
                opcion = entrada.nextInt();
            } catch (Exception e) {

                entrada = new Scanner(System.in);
            }

            switch (opcion) {
                case 1:
                    Presentar p = new Presentar();
                    p.Presentar();
                    break;
                case 2:

                    break;

                case 3:
                    entrada.nextLine();
                    System.out.println("Ingresa el nodo a modificar");
                    nodees = entrada.nextLine();
                    Presentar m = new Presentar();
                    m.Modificar(nodees);
                    break;
                case 4:

                    break;
                           

                case 5:
                    System.exit(0);
                    break;
                default:
                    System.out.println("Opcion no valida");
                    break;
            }

        }
    }

}


y en otra clase tengo las funciones
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import jdk.internal.org.objectweb.asm.commons.GeneratorAdapter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
*
* @author orlando
*/
public class Presentar {

    public void Presentar() {
        try {

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = factory.newDocumentBuilder();

            Document documento = builder.parse(new File("peliculas.xml"));

            NodeList listaPelis = documento.getElementsByTagName("pelicula");

            for (int i = 0; i < listaPelis.getLength(); i++) {

                Node nodo = listaPelis.item(i);

                if (nodo.getNodeType() == Node.ELEMENT_NODE) {

                    Element e = (Element) nodo;

                    NodeList hijos = e.getChildNodes();

                    for (int j = 0; j < hijos.getLength(); j++) {

                        Node hijo = hijos.item(j);

                        if (hijo.getNodeType() == Node.ELEMENT_NODE) {

                            System.out.println(hijo.getNodeName() + ":  " + hijo.getTextContent());
                        }

                    }
                    System.out.println("----------------------------------------------");
                }

            }

        } catch (ParserConfigurationException | SAXException | IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void Añadir() {

    }

    public void Modificar(String nodoModificar) {
        File fichXML = new File("peliculas.xml");
        try {

            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(fichXML);

            doc.getDocumentElement().normalize();

            Node nDam = doc.getFirstChild();

            NodeList nPelis = nDam.getChildNodes();
            for (int cont1N = 0; cont1N < nPelis.getLength(); cont1N++) {

                Node cadaC = nPelis.item(cont1N);

                NodeList nTitulo = cadaC.getChildNodes();
                for (int cont2N = 0; cont2N < nTitulo.getLength(); cont2N++) {

                    Node cadaPeli = nTitulo.item(cont2N);

                    if (nodoModificar.equals(cadaPeli.getNodeName())) {
                        System.out.println("Ingresa el valor del nodo seleccionado que deseas cambiar");
                        Scanner entrada = new Scanner(System.in);
                        String n = entrada.nextLine();
                        if (n.equals(cadaPeli.getNodeValue())) {
                            System.out.println("Ingresa la nueva informacion del nodo"); 
                            String m = entrada.nextLine();
                             nTitulo.item(cont2N).setTextContent(m);
                        }
                    }
                }
            }

            TransformerFactory factoriaTransf = TransformerFactory.newInstance();
            Transformer transformador = factoriaTransf.newTransformer();
            DOMSource source = new DOMSource(doc);

            StreamResult consoleResult = new StreamResult(System.out);
            transformador.transform(source, consoleResult);

            StreamResult fileResult = new StreamResult(new File("peliculas.xml"));
            transformador.transform(source, fileResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void eliminar() {

       
    }

}


rub'n

#3
Hice un Builder, debes invocar a la primera opción si no esta creado el archivo, opcion 0

Para crear usar numero 0
Código (java) [Seleccionar]

/**
* Instanciando Builder para crear Elemento Root e hijos
*/
    new Presentar.Builder()
           .conDocument(BuilderFile.CREATE)
           .conRootElement(TIENDA)
           .conId("1")
           .createNodeAndChild(PELICULA, "titulo", "Rambo 1")
           .conId("2")
           .createNodeAndChild(PELICULA, "titulo", "Rambo 2")
           .build();


Para modificar el fichero usa

viejoNombre = Rambo 2
nuevoNombre= Rambo 2 la resurrecion

Código (java) [Seleccionar]

new Presentar.Builder()
                   .conDocument(BuilderFile.READ)
                   .modificarChilNode(viejoNombre, nuevoNombre)
                   .build();



Código (java) [Seleccionar]
package org.example;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
import java.util.stream.IntStream;

interface Log {
   default void info(String texto) {
       Logger.getLogger(Presentar.class.getSimpleName()).info(texto);
   }

   default void warn(String texto) {
       Logger.getLogger(Presentar.class.getSimpleName()).info(texto);
   }
}

enum BuilderFile {
   CREATE,READ;
}

/**
* @author orlando
*/
public class Presentar implements Log {

   private static final String PELICULA = "pelicula";
   private static final String TIENDA = "tienda";

   /**
    * Ruta por defecto para crear el fichero
    */
   private static final Path PATH_DOC_XML_FILE = Paths.get("peliculas.xml");

   /**
    * Invocar primero si no existe documento
    */
   public void crearDocumento() {

       /**
        * Instanciando Builder para crear Elemento Root e hijos
        */
       new Presentar.Builder()
               .conDocument(BuilderFile.CREATE)
               .conRootElement(TIENDA)
               .conId("1")
               .createNodeAndChild(PELICULA, "titulo", "Rambo 1")
               .conId("2")
               .createNodeAndChild(PELICULA, "titulo", "Rambo 2")
               .build();

       info("Archivo creado correctamente!");

   }


   public void presentar() {
       try {

           final NodeList listaPelis = DocumentBuilderFactory.newInstance()
                   .newDocumentBuilder()
                   .parse(new File("peliculas.xml"))
                   .getElementsByTagName(PELICULA);

           for (int i = 0; i < listaPelis.getLength(); i++) {

               Node nodo = listaPelis.item(i);

               if (nodo.getNodeType() == Node.ELEMENT_NODE) {

                   Element e = (Element) nodo;

                   NodeList hijos = e.getChildNodes();

                   for (int j = 0; j < hijos.getLength(); j++) {

                       Node hijo = hijos.item(j);

                       if (hijo.getNodeType() == Node.ELEMENT_NODE) {

                           info(hijo.getNodeName() + ":  " + hijo.getTextContent());

                       }

                   }
                   info("----------------------------------------------");
               }

           }

       } catch (ParserConfigurationException | SAXException | IOException ex) {
           warn(ex.getMessage());
       }
   }

   public void Añadir() {

   }

   public void modificar(String nodoModificar, String nuevoNombre) {
       try {

           new Presentar.Builder()
                   .conDocument(BuilderFile.READ)
                   .modificarChilNode(nodoModificar, nuevoNombre)
                   .build();

       } catch (Exception e) {
           warn(e.getMessage());
       }
   }

   public void eliminar() {


   }

   /**
    * Builder para crear elementos
    */
   public static class Builder implements Log {

       private Element rootElement;
       private Attr attr;
       private Document document;

       //Primero
       public Builder conDocument(BuilderFile builderFile) {
           if(builderFile == BuilderFile.CREATE) {
               try {
                   this.document = DocumentBuilderFactory.newInstance()
                           .newDocumentBuilder()
                           .newDocument();
               } catch (ParserConfigurationException e) {
                   warn("{} error en createNewDocument()");
               }
           } else if(builderFile == BuilderFile.READ){
               try {
                   this.document = DocumentBuilderFactory.newInstance()
                           .newDocumentBuilder()
                           .parse(PATH_DOC_XML_FILE.toFile());
               } catch (ParserConfigurationException e) {
                   warn("{} error en createNewDocument()");
               } catch (SAXException e) {
                   e.printStackTrace();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }

           return this;
       }

       //Segundo titulo
       public Builder conRootElement(final String nombre) {
           this.rootElement = document.createElement(nombre);
           document.appendChild(rootElement);
           return this;
       }

       public Builder conId(final String id) {
           this.attr = document.createAttribute("id");
           attr.setValue(id);
           return this;
       }

       //Pelicula
       public Builder createNodeAndChild(final String nodeName, final String title, final String childName) {
           //Node title
           final Element nodeTitle = document.createElement(nodeName);
           rootElement.appendChild(nodeTitle);
           nodeTitle.setAttributeNode(this.attr);

           //Child title
           final Element childNameTitle = document.createElement(title);
           childNameTitle.appendChild(document.createTextNode(childName));
           nodeTitle.appendChild(childNameTitle);
           return this;
       }

       public Builder modificarChilNode(final String viejoNombre, final String nuevoNombre) {
            //normalizar
            document.getDocumentElement().normalize();
            //Lista peliculas
            final NodeList listaPeliculas = document.getElementsByTagName(PELICULA);

            final AtomicBoolean value = new AtomicBoolean(true);
            IntStream.range(0, listaPeliculas.getLength())
                    .boxed()
                    .parallel()
                    .forEachOrdered(pelicula -> {
                        final Node node = listaPeliculas.item(pelicula);
                        if (node.getNodeType() == Node.ELEMENT_NODE) {
                            final Element element = (Element) node;
                            if (element.hasChildNodes()) {
                                final NodeList childNodes = node.getChildNodes();
                                for (int j = 0; j < childNodes.getLength(); j++) {
                                    final Node child = childNodes.item(j);
                                    if (child.getTextContent().equals(viejoNombre)) {
                                        child.setTextContent(nuevoNombre);
                                        info("Nodo: ".concat(viejoNombre)
                                                .concat(" cambiado por ")
                                                .concat(nuevoNombre));
                                        info("Edición terminada correctamente");
                                        value.set(false);
                                    }
                                }
                            }
                        }
                    });
            if(value.get()) {
                warn("No existe el titulo");
            }
            return this;
        }

       public Builder build() {
           try {
               TransformerFactory.newInstance()
                       .newTransformer()
                       .transform(new DOMSource(document), new StreamResult(PATH_DOC_XML_FILE.toFile()));
           } catch (TransformerException e) {
               warn("error al escribir en fichero .xml");
           }
           return this;
       }
   }

}
}


Codigo del switch

Código (java) [Seleccionar]
//Mejor Map<String,String> a
           switch (opcion) {
               case 0:
                   final Presentar presentar = new Presentar();
                   presentar.crearDocumento();
                   break;
               case 1:
                   Presentar p = new Presentar();
                   p.presentar();
                   break;
               case 2:
                   break;
               case 3:
                   entrada.nextLine();
                   System.out.println("Ingresa el nodo a modificar");
                   String nombreNodo = entrada.nextLine();
                   System.out.println("Ingresa nuevo nombre");
                   String nuevoNombre = entrada.nextLine();

                   Presentar m = new Presentar();
                   m.modificar(nombreNodo, nuevoNombre);
                   break;
               case 4:
                   break;
               case 5:
                   System.exit(0);
                   break;
               default:
                   System.out.println("Opcion no valida");
                   break;
           }


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

Gracias  por la ayuda.

ryhuso

No se si es mucha molestia... y para crear un nodo nuevo dentro de películas solo tendría que usar el builder y mandarle los datos por teclado ? y donde lo pondría al principio o al final.

rub'n

Cita de: ryhuso en  8 Mayo 2020, 10:42 AM
No se si es mucha molestia... y para crear un nodo nuevo dentro de películas solo tendría que usar el builder y mandarle los datos por teclado ? y donde lo pondría al principio o al final.

Respuesta innesperada, pense que solo querías copiar y pegar LMAOOO

Para crear un nodo nuevo, instanciando el builder puedes hacer o añadiendo otro con el metodo añadir que te tocaría reprogramarlo, si que hay mucha informacion por ahi.

Recordemos que el Builder y su method chaining tienen cierto orden a la hora de crear Objetos entonces, sabiendo eso. puedes invocar a createNodeAndChild 3 veces, ejemplo:


Código (java) [Seleccionar]

new Presentar.Builder()
           .conDocument(BuilderFile.CREATE)
           .conRootElement(TIENDA)
           .conId("1")
           .createNodeAndChild(PELICULA, "titulo", "Rambo 1")
           .conId("2")
           .createNodeAndChild(PELICULA, "titulo", "Rambo 2")
           .conId("3")
           .createNodeAndChild(PELICULA, "titulo", "ryhuso la resurrecion")
           .build();




rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

Básicamente lo que busco es tener un opción de añadir nueva película, si lo pongo como me dices tendría que sobrescribir el xml que ya tengo creado?

rub'n

Cita de: ryhuso en  8 Mayo 2020, 11:07 AM
Básicamente lo que busco es tener un opción de añadir nueva película, si lo pongo como me dices tendría que sobrescribir el xml que ya tengo creado?

Tal cual dog... asi mismo.

Para añadir otro Nodo digamos, debes reprogramarlo , ya tienes una idea al menos.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

bueno gracias le echare cabeza  :laugh: :laugh: