Eliminar XML Node con el analizador de Java

En el ejemplo XML siguiente, cómo eliminar el Nodo B completo si E = 13 usando el analizador de Java.

    11 12     13 14    

Por favor avise.

Enfoque DOM alternativo

Alternativamente, en lugar de hacer un recorrido de fuerza bruta del documento XML, puede usar las capacidades de XPath en el JDK para encontrar el elemento “B” con el valor “13” y luego eliminarlo de su elemento primario:

 import java.io.File; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.*; import org.w3c.dom.*; public class Demo { public static void main(String[] args) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document document = dbf.newDocumentBuilder().parse(new File("input.xml")); XPathFactory xpf = XPathFactory.newInstance(); XPath xpath = xpf.newXPath(); XPathExpression expression = xpath.compile("//A/B[C/E/text()=13]"); Node b13Node = (Node) expression.evaluate(document, XPathConstants.NODE); b13Node.getParentNode().removeChild(b13Node); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); t.transform(new DOMSource(document), new StreamResult(System.out)); } } 

La ventaja de utilizar un XPath es más fácil de mantener, si la estructura cambia, se trata de un cambio de una línea en su código. Además, si la profundidad de su documento aumenta, la solución basada en XPath mantiene el mismo número de líneas.

Enfoque no DOM

Si no quiere materializar su XML como DOM. Podría usar un transformador y una hoja de estilo para eliminar un nodo:

Es fácil si estás usando DOM. Simplemente recorra el documento y realice un seguimiento de los nodos B. Cuando golpee un nodo E = 13, elimine el nodo B. Aquí hay un código para ayudar:

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); Document doc = factory.newDocumentBuilder().parse(new File("file.xml")); DocumentTraversal traversal = (DocumentTraversal) doc; Node a = doc.getDocumentElement(); NodeIterator iterator = traversal.createNodeIterator(a, NodeFilter.SHOW_ELEMENT, null, true); Element b = null; for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { Element e = (Element) n; if ("B".equals(e.getTagName())) { b = e; } else if ("E".equals(e.getTagName()) && "13".equals(e.getTextContent()) && b != null) { a.removeChild(b); } } 

Probé este ejemplo de archivo con el código de Blaise y me sale

 Exception in thread "main" java.lang.NullPointerException at myxml.xmlParty2.main(xmlParty2.java:22) 

Este es el archivo

     wf2333 desc_title_5 2 Impossible de joindre Cliquez sur le lien ci-dessous pour effectuer une nouvelle tentative.   desc_wf_1_etat_1 desc_wf_1_etat_2     wf2334 desc_title_5 2 Impossible de joindre Cliquez sur le lien ci-dessous pour effectuer une nouvelle tentative.   desc_wf_1_etat_1 desc_wf_1_etat_2    

y Xptah Query es XPathExpression expression = xpath.compile("/favoris/workflow[@id='wf2333']");

Aquí está el código para eliminar el nodo B usando XPath con predicado. Se basa en VTD-XML , que implementa de manera única la actualización incremental.

 import com.ximpleware.*; import java.io.*; public class removeNode { public static void main(String s[]) throws VTDException, IOException{ VTDGen vg = new VTDGen(); if (!vg.parseFile("input.xml", false)); VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); XMLModifier xm = new XMLModifier(vn); ap.selectXPath("/xml/A/B[C/E='13']"); while (ap.evalXPath()!=-1){ xm.remove(); } xm.output("output.xml"); } }