Rimuovi il nodo XML usando parser java

Nel seguente esempio di XML, come rimuovere l’intero nodo B se E = 13 utilizzando parser java.

    11 12     13 14    

Si prega di avvisare.

Approccio DOM alternativo

In alternativa, invece di eseguire un attraversamento di forza bruta del documento XML, è ansible utilizzare le capacità XPath nel JDK per trovare l’elemento “B” con il valore “13” e quindi rimuoverlo dal suo genitore:

 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); TransformsrFactory tf = TransformsrFactory.newInstance(); Transformsr t = tf.newTransformsr(); t.transform(new DOMSource(document), new StreamResult(System.out)); } } 

Il vantaggio dell’utilizzo di un XPath è più semplice da mantenere, se la struttura cambia è solo una modifica di una riga al codice. Inoltre, se la profondità del documento aumenta, la soluzione basata su XPath rimane lo stesso numero di righe.

Approccio non DOM

Se non vuoi materializzare il tuo XML come DOM. Potresti usare un Transformsr e un foglio di stile per rimuovere un nodo:

È facile se usi DOM. Basta attraversare il documento e tenere traccia dei nodes B. Quando si colpisce un nodo E = 13, rimuovere il nodo B. Ecco un codice per aiutare:

 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); } } 

Ho provato questo esempio di file con il codice Blaise e ottengo

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

Questo è il file

     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    

e la query Xptah è XPathExpression expression = xpath.compile("/favoris/workflow[@id='wf2333']");

Ecco il codice di rimozione del nodo B usando XPath con predicato. È basato su VTD-XML , che implementa in modo univoco l’aggiornamento incrementale.

 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"); } }