InsideDarkWeb.com

Agregar un texto a un pom.xml desde Java

tengo el siguiente problema, tengo una app que nos genera unos archivos a partir de unas plantillas, pero el pom no lo podemos generar a partir de unas plantillas, así que manejamos su cuerpo de otra manera, el caso es que lo que quiero hacer es que al seleccionar una dependencia y darle generar este se añada al POM con las etiquetas correspondientes, ya logre manejar el archivo, al generar el pom, se añade de esta manera

introducir la descripción de la imagen aquí

Pero la idea es que como lo imprime en consola, se agregue al Pom, lo cual es así:

introducir la descripción de la imagen aquí

¿Hay alguna manera de hacerlo? ¿O debería manejar la cadena y sacar los datos que están dentro de las etiquetas? Aunque esto ultimo no sé hacerlo.

Este es mi fragmento de codigo:

try {
                DependenciasDTO listConfi = null;
                for (DependenciasDTO dependenciasDTO : checkDependencias) {
                    listConfi = DependenciaDAO.findByName(dependenciasDTO.toString());
                }
                System.out.println(listConfi.getConfiguracion());
                File file = new File(newDirectory + "\Base\pom.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(file);
                doc.getDocumentElement().normalize();
                org.w3c.dom.NodeList dependencies = doc.getElementsByTagName("dependencies");
                /*Element dependency = doc.createElement("Prueba");
                dependency.appendChild(doc.createTextNode("Hola"));*/
                dependencies.item(0).appendChild(doc.createTextNode(listConfi.getConfiguracion().toString()));
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = null;
                try {
                    transformer = transformerFactory.newTransformer();
                } catch (TransformerConfigurationException ex) {
                    System.out.println(ex);
                }
                DOMSource source = new DOMSource(doc);
                StreamResult result = new StreamResult(new File(newDirectory + "\Base\pom.xml"));
                transformer.transform(source, result);

                System.out.println("Done");
            } catch (Exception e) {
                // TODO: handle exception
            }

2 Answers

Tienes el enfoque equivocado.

Te explico primero el problema: quieres agregar una serie de elementos anidados al XML, contenidos en un string. Para ello estás utilizando utilizando un método que agrega un elemento. Este método, al recibir el texto, lo codifica para evitar conflictos con la estructura del XML en si. Este algoritmo de codificación convierte todos los caracteres que podrían entrar en conflicto utilizando entidades de caracteres.

Por ello, el < es convertido en &lt;, el > en &gt;, etc.

Una posible solución es cargar el contenido del XML que tienes en texto en un documento e importar el contenido de este nuevo documento dentro del elemento <dependencies> de tu documento original.

Primero, para leer el contenido XML de un string, te puedes valer de un StringReader, algo así:

    String listConfi = ""
      + "<dependency>"
      + "  <groupID>oracle</groupID>"
      + "  <artifactId>driver</artifactId>"
      + "  <version>1.4.2_14</version>"
      + "  <scope>system</scope>"
      + "  <systemPath>$(project.basedir)\src\main\webapp\WEB-INF\lib\ojdbc14-10.2.0.5.0.jar</systemPath>"
      + "</dependency>";

    DocumentBuilderFactory textFactory = DocumentBuilderFactory.newInstance();  
    DocumentBuilder textBuilder = textFactory.newDocumentBuilder();    
    Document textDocument = textBuilder.parse(new InputSource(new StringReader(listConfi)));  

Ahora que tenemos cargado el contenido XML en textDocument, puedes obtener el nodo principal e importarlo en el nodo <dependencies>:

    Node dependencies = document.getElementsByTagName("dependencies").item(0);

    Node textRoot = textDocument.getDocumentElement();
    dependencies.appendChild(document.importNode(textRoot, true));

Pasamos true al parámetro deep de importNode para que la importación incluya los atributos y nodos hijos de manera recursiva.

Haciendo algunos cambios adicionales a tu código, luciría algo así:

    //procesamos primero el XML a _importar_
    DocumentBuilderFactory textFactory = DocumentBuilderFactory.newInstance();  
    DocumentBuilder textBuilder = textFactory.newDocumentBuilder();    
    Document textDocument = textBuilder.parse(new InputSource(new StringReader(listConfi.getConfiguracion().toString())));  
    
    //obtenemos y cargamos el XML donde queremos importarlo y buscamos el nodo <dependencies>
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    Document pom = documentBuilder.parse("C:\test\SO\375259\pom.xml"); 
    Node dependencies = pom.getElementsByTagName("dependencies").item(0);

    //hacemos la importación
    Node textDocument = textDocument.getDocumentElement();
    dependencies.appendChild(pom.importNode(textDocument, true));

    //finalmente guardamos        
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(pom);
    StreamResult result = new StreamResult(new File("C:\test\SO\375259\pomNuevo.xml"));

    transformer.transform(source, result);

Answered by jachguate on November 15, 2021

Al usar createTextNode, lo que estás haciendo es insertar un texto por lo que los caracteres especiales son codificados a entidades.

Mi sugerencia es que conviertas el texto que quieras insertar y luego insertes ese objeto.

String dependency = "<example />";

try (
    InputStream is = new ByteArrayInputStream(dependency.getBytes())
) {
    // Codigo

    Document newDocument = dBuilder.parse(is);
    NodeList newNodeList = newDocument.getChildNodes();
    for (int i = 0; i < newNodeList.getLength(); i++) {
        Node newNode = doc.importNode(newNodeList.item(i), true);
        dependencies.item(0).appendChild(newNode);
    }

    // Codigo
}

Answered by wsaca on November 15, 2021

Add your own answers!

Related Questions

Ayuda con array tridimensional

1  Asked on August 26, 2021

   

Cards Bootstrap

1  Asked on August 26, 2021 by nat-najera

     

Inicialización: corchetes { }, asignación =, y otras formas

1  Asked on August 26, 2021 by federico-choy

 

Acceso a RowCommand aspx

1  Asked on August 26, 2021 by ledferoz10

       

¿Como recargar un div al enviar un formulario?

1  Asked on August 26, 2021 by jos-carlos-castillo

       

¿Donde inicializar una BD SQLite en Android?

2  Asked on August 26, 2021 by antonio-ruiz

     

Formato adecuado para implementar videos en Android Studio

1  Asked on August 26, 2021 by cristian-sierra

 

Rellenar un array con valores de otro array

2  Asked on August 26, 2021 by diego-sanchez

   

Al entrar en vim se me activa el replace

1  Asked on August 26, 2021

     

Error al correr: php public/index.php en proyecto Zend

1  Asked on August 26, 2021 by esteban-ali-yaez-badillo

 

¿Cómo relacionar elementos de un Array entre ellos?

2  Asked on August 26, 2021 by nicolas-oate

     

Ask a Question

Get help from others!

© 2021 InsideDarkWeb.com. All rights reserved.