2010-09-03 4 views
14

Ho difficoltà a cercare di indentare i file XML utilizzando XMLSerializer.Come indentare il codice XML in modo corretto utilizzando XMLSerializer?

Ho provato

serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", 
         true); 

Ho cercato di aggiungere \n nella FileWriter ma l'uscita è il \n 's e \t' s all'inizio del file e non nel posto giusto. Ho provato setPropery con il corretto URI ecc

Parte del codice:

XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance(); 
parserFactory .setNamespaceAware(true); 
XmlSerializer serializer = parserFactory .newSerializer(); 
File xmlFile = new File(PATH + ".xml");   
FileWriter writer = new FileWriter(xmlFile);    
serializer.setOutput(writer); 
//serializer.setProperty(INDENT_URL, INDENT); 
serializer.startDocument("UTF-8", null); 
//serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", 
         true); 
serializer.startTag(null, "bla"); 
writer.append('\n'); 

Che cosa mi manca?

risposta

4

Hai provato a utilizzare queste due proprietà "in combinazione" su Serializer?

// indentation as 3 spaces 
serializer.setProperty(
    "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " "); 
// also set the line separator 
serializer.setProperty(
    "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n"); 
+8

Sì. Ho fatto e mi ha dato questo errore: java.lang.RuntimeException: Proprietà non supportata: in org.kxml2.io.KXmlSerializer.setProperty (KXmlSerializer.java:260) .... –

+2

Questo non funziona –

+0

@Eduardo Berton: Questa non è la risposta corretta, non funziona –

3

Questa è una soluzione in Java, andriod supporta il trasformatore, quindi dovrebbe funzionare.

// import additional packages 
import java.io.*; 

// import DOM related classes 
import org.w3c.dom.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.stream.*; 

// write the output file 
try { 
    // create a transformer 
    TransformerFactory transFactory = TransformerFactory.newInstance(); 
    Transformer  transformer = transFactory.newTransformer(); 

    // set some options on the transformer 
    transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

    // get a transformer and supporting classes 
    StringWriter writer = new StringWriter(); 
    StreamResult result = new StreamResult(writer); 
    DOMSource source = new DOMSource(xmlDoc); 

    // transform the xml document into a string 
    transformer.transform(source, result); 

    // open the output file 
    FileWriter outputWriter = new FileWriter(outputFile); 
    outputWriter.write(writer.toString()); 
    outputWriter.close(); 

} catch(javax.xml.transform.TransformerException e) { 
    // do something with this error 
}catch (java.io.IOException ex) { 
    // do something with this error 
} 
+0

:) Ho appena google buono buono oggi. Il serializzatore XML serve per serializzare i dati in XML e lo scrittore di file scrive su un file. Quindi la responsabilità di formattare a qualcosa di leggibile può trovarsi in un'altra classe se già esiste :) – JonWillis

+2

Ho provato questo, ma continuo a ricevere file non indentati :(Nessun errore però. – Peterdk

+1

Se posso aggiungere qualcosa qui, assicurati di ' '' replaceAll ("[\\ s] +", "") '' 'in caso di stringhe Nel mio caso la stringa xml aveva già' '' \ n''' e il rientro non stava accadendo –

35

serializer.setFeature(" http://xmlpull.org/v1/doc/features.html#indent-output ", true); ha funzionato ora.

Non so se lo stavo inserendo prima dello serializer.startDocument(encoding, standalone) o si è verificato un errore con elementi non correlati alla creazione di .xml!

Grazie ragazzi!

+0

come inserire i commenti quindi? – accuya

1

Volevo solo prendere nota del fatto che lo Transformer.setOutputProperties(Properties) non sembra funzionare per me (1.6.0_26_b03), ma lo Transformer.setOutputProperty(String,String) funziona perfettamente.
Se si dispone di un oggetto Proprietà, potrebbe essere necessario iterare e impostare individualmente la proprietà di uscita affinché funzioni.