Elimina gli spazi bianchi e i newline dall’XML in Java

Utilizzando Java, vorrei prendere un documento nel seguente formato:

     

e convertirlo in:

  

Ho provato quanto segue, ma non mi sta dando il risultato che mi aspetto:

 DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); dbfac.setIgnoringElementContentWhitespace(true); DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); Document doc = docBuilder.parse(new FileInputStream("/tmp/test.xml")); Writer out = new StringWriter(); Transformsr tf = TransformsrFactory.newInstance().newTransformsr(); tf.setOutputProperty(OutputKeys.INDENT, "no"); tf.transform(new DOMSource(doc), new StreamResult(out)); System.out.println(out.toString()); 

Soluzione di lavoro seguendo le istruzioni nei commenti della domanda di @Luiggi Mendoza.

 public static String trim(String input) { BufferedReader reader = new BufferedReader(new StringReader(input)); StringBuffer result = new StringBuffer(); try { String line; while ( (line = reader.readLine() ) != null) result.append(line.trim()); return result.toString(); } catch (IOException e) { throw new RuntimeException(e); } } 

attraversa in modo ricorsivo il documento. rimuovere eventuali nodes di testo con contenuto vuoto. tagliare qualsiasi nodo di testo con contenuto non vuoto.

 public static void trimWhitespace(Node node) { NodeList children = node.getChildNodes(); for(int i = 0; i < children.getLength(); ++i) { Node child = children.item(i); if(child.getNodeType() == Node.TEXT_NODE) { child.setTextContent(child.getTextContent().trim()); } trimWhitespace(child); } } 

Come documentato in una risposta ad un’altra domanda , la funzione rilevante sarebbe DocumentBuilderFactory.setIgnoringElementContentWhitespace () , ma – come già sottolineato qui – quella funzione richiede l’uso di un parser di convalida, che richiede uno schema XML, o alcuni di questi.

Pertanto, la soluzione migliore è quella di scorrere il documento ottenuto dal parser e rimuovere tutti i nodes di tipo TEXT_NODE (o quelli TEXT_NODE che contengono solo spazi bianchi).

Prova questo codice. read metodi di read e write in FileStream ignorano lo spazio bianco e i rientri.

 try { File f1 = new File("source.xml"); File f2 = new File("destination.xml"); InputStream in = new FileInputStream(f1); OutputStream out = new FileOutputStream(f2); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0){ out.write(buf, 0, len); } in.close(); out.close(); System.out.println("File copied."); } catch(FileNotFoundException ex){ System.out.println(ex.getMessage() + " in the specified directory."); System.exit(0); } catch(IOException e7){ System.out.println(e7.getMessage()); }