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
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);
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP