TransWikia.com

Eliminar nodo padre de un xml basado en sus hijos - JAVA

Stack Overflow en español Asked on January 1, 2022

tengo este formato en un xml

<context-param>
    <param-name>primefaces.PUBLIC_CAPTCHA_KEY</param-name>
    <param-value></param-value>
  </context-param>
  <context-param>
    <param-name>primefaces.PRIVATE_CAPTCHA_KEY</param-name>
    <param-value></param-value>
  </context-param>

Quiero que cuando Java detecte que los param-value esten vacios estos eliminen el nodo completo, es decir de a , pero no he logrado mi cometido, lo unico que obtuve fue eliminar param-value con removeChild.

File fileWeb = new File(newDirectory + "\Base\src\main\webapp\WEB-INF\web.xml");
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                org.w3c.dom.Document web = db.parse(fileWeb);

                NodeList items = web.getElementsByTagName("context-param");
                for (int ix = 0; ix < items.getLength(); ix++) {
                    org.w3c.dom.Node nodo= items.item(ix);
                    org.w3c.dom.NodeList hijos = nodo.getChildNodes();
                    for (int i = 0; i < hijos.getLength(); i++) {
                        org.w3c.dom.Node nodoHijo=hijos.item(i);
                        if (nodoHijo.equals("param-value")) {
                            if (nodoHijo.getTextContent().equals("")) {
                                nodoHijo.removeChild(nodoHijo);
                            }
                        }
                    }


                }
                // 3. Exportar nuevamente el XML
                TransformerFactory tff = TransformerFactory.newInstance();
                Transformer tf = tff.newTransformer();
                DOMSource source = new DOMSource(web);
                StreamResult result = new StreamResult(
                        new File(newDirectory + "\Base\src\main\webapp\WEB-INF\web.xml"));
                tf.transform(source, result);

Esto es lo que recibo como salida y lo que espero es que si param value no tiene valor en su texto, toda la etiqueta sea eliminada

introducir la descripción de la imagen aquí

ACTUALIZACION

Pues he seguido intentando y ahora, logre que si me eliminara toda la etiqueta, pero si ambos param-value estan vacios, me elimina todo el primer context param, pero por alguna extraña razon el siguiente context-param queda con el para value de esta forma,

<context-param>
    <param-name>primefaces.PRIVATE_CAPTCHA_KEY</param-name>
    <param-value/>
  </context-param>

Me imagino que por eso no lo leera/no entra a mi condicion y no lo logra eliminarlo, asi quedo mi codigo con el update

File fileWeb = new File(newDirectory + "\Base\src\main\webapp\WEB-INF\web.xml");
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                org.w3c.dom.Document web = db.parse(fileWeb);
                org.w3c.dom.Node padre = null;
                NodeList items = web.getElementsByTagName("param-value");
                for (int ix = 0; ix < items.getLength(); ix++) {
                    String content = items.item(ix).getTextContent();
                    if(content.equals("")) {
                        padre = items.item(ix).getParentNode();
                        web.getDocumentElement().removeChild(padre);
                    }   
                }
                
                // 3. Exportar nuevamente el XML
                TransformerFactory tff = TransformerFactory.newInstance();
                Transformer tf = tff.newTransformer();
                DOMSource source = new DOMSource(web);
                Result result = new StreamResult(
                        new File(newDirectory + "\Base\src\main\webapp\WEB-INF\web.xml"));
                tf.transform(source, result);

One Answer

al parecer encontré solución a mi problema, pues en el pom, el param-name de los context-param siempre van a ser lo mismos dos, entonces, hice una nueva lista con los nodos param-name e itere ambos, param-value y param-name, para luego terminar con una condicional que dio solucion a mi problema:

try {

                File fileWeb = new File(newDirectory + "\Base\src\main\webapp\WEB-INF\web.xml");
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                org.w3c.dom.Document web = db.parse(fileWeb);
                NodeList items = web.getElementsByTagName("param-value");
                NodeList params=web.getElementsByTagName("param-name");
                for (int ix = 0; ix < items.getLength(); ix++) {
                    
                    for (int i = 0; i < params.getLength(); i++) {
                        String content = items.item(i).getTextContent();
                        String nameParam = params.item(i).getTextContent();
                        if (content.equals("") && (nameParam.equals("primefaces.PUBLIC_CAPTCHA_KEY") || nameParam.equals("primefaces.PRIVATE_CAPTCHA_KEY"))) {
                            org.w3c.dom.Node padre = items.item(i).getParentNode();
                            web.getDocumentElement().removeChild(padre);

                        }
                    }
                    
                }

                // 3. Exportar nuevamente el XML
                TransformerFactory tff = TransformerFactory.newInstance();
                Transformer tf = tff.newTransformer();
                DOMSource source = new DOMSource(web);
                Result result = new StreamResult(
                        new File(newDirectory + "\Base\src\main\webapp\WEB-INF\web.xml"));
                tf.transform(source, result);

            } catch (Exception e) {
                System.out.println(e);
            }

Answered by Daniel Morales on January 1, 2022

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