2012-07-28 14 views
10

Utilizzo di Java, vorrei prendere un documento nel seguente formato:Rimuove gli spazi e ritorni a capo da XML in Java

<tag1> 
<tag2> 
    <![CDATA[ Some data ]]> 
</tag2> 
</tag1> 

e convertirlo in:

<tag1><tag2><![CDATA[ Some data ]]></tag2></tag1> 

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(); 
Transformer tf = TransformerFactory.newInstance().newTransformer(); 
tf.setOutputProperty(OutputKeys.INDENT, "no"); 
tf.transform(new DOMSource(doc), new StreamResult(out)); 
System.out.println(out.toString()); 
+1

Si può considerare questo come un file di testo, aprirlo con un BufferedReader, leggere ogni riga e salvare il suo valore di trim all'interno di uno StringBuilder, dopo tutto questo, usare un BufferedWriter per salvare il file con il contenuto di StingBuilder. –

+2

Se sei disposto ad usare qualcosa come Xerces-J puoi usare OutputFormat per non stampare i risultati: http://xerces.apache.org/xerces-j/apiDocs/org/apache/xml/serialize/OutputFormat .html –

+1

btw, il motivo per cui "setIgnoringElementContentWhitespace' non è d'aiuto è perché si deve utilizzare la convalida XML Schema/DTD affinché il parser sappia quali spazi bianchi sono ignorabili. – jtahlborn

risposta

15

Soluzione di lavoro seguendo le istruzioni nei commenti delle domande 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); 
    } 
} 
+0

Nota che è necessario chiudere BufferedReader dopo l'uso utilizzando ** finally ** o Java 8 [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) . – RikH

5

attraversare in modo ricorsivo il documento. rimuovere eventuali nodi 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); 
    } 
} 
+0

Rimuove gli spazi nel nodo - l'esempio non ha spazi nei nodi di testo – Mark

+1

@Mark - in realtà lo fa. i contenuti di "tag2" coinvolgono le nuove linee e gli spazi e seguono le linee e gli spazi. – jtahlborn

+1

perché i downvotes? questo farà esattamente ciò che l'OP vuole. – jtahlborn

-4

Prova questo codice. I metodi 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()); 
} 
+3

che è un modo fantastico per spezzare il file xml ... – jtahlborn

+4

Mai lavorare su file XML con flussi puri –

+1

WOOOW codice qualità come decompilato, il codice non toglie affatto spazi vuoti –

4

Come documentato nel an answer to another question, la funzione corrispondente sarebbe DocumentBuilderFactory.setIgnoringElementContentWhitespace(), ma - come sottolineato già qui - che la funzione richiede l'utilizzo di un parser di convalida, che richiede uno schema XML, o qualcosa del genere.

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

Problemi correlati