TransWikia.com

Agregar un texto a un pom.xml desde Java

Stack Overflow en español Asked by Daniel Morales on November 15, 2021

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!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP