2010-09-03 5 views
14

Ich habe eine harte Zeit versucht, XML-Dateien mit einzurücken.Wie kann ich XML mit XMLSerializer korrekt einrücken?

I

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

habe versucht, ich habe versucht, \n in FileWriter anhängen aber die Ausgabe ist die \n ‚s und \t‘ s am Anfang der Datei und nicht in der richtigen Stelle. Ich habe setPropery versucht, mit der richtigen URI usw.

Teil des Codes:

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

Was bin ich fehlt?

Antwort

4

Haben Sie versucht, diese beiden Eigenschaften "in Kombination" auf dem Serializer zu verwenden?

// 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

Ja. Ich tat, und es gab mir diesen Fehler: java.lang.RuntimeException: Nicht unterstützte Eigenschaft: bei org.kxml2.io.KXmlSerializer.setProperty (KXmlSerializer.java:260) .... –

+2

Dies funktioniert nicht –

+0

@ Eduardo Berton: Dies ist nicht die richtige Antwort, es nicht –

3

Dies ist eine Lösung in Java ist, tut andriod Transformator unterstützen, so sollte diese Arbeit.

// 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

:) Ich habe nur gute google foo heute. Der XML-Serialisierer dient dazu, Daten in XML zu serialisieren, und der Dateischreiber schreibt in eine Datei. Also in der Verantwortung formatieren, um etwas für Menschen lesbaren liegt in einer anderen Klasse, wenn es bereits vorhanden ist :) – JonWillis

+2

ich das versucht, aber ich erhalte nicht eingekerbten Dateien :(obwohl keine Fehler. – Peterdk

+1

Wenn ich hier etwas hinzufügen kann, sollten Sie ' '' replaceAll ("[\\ s] +", "") '' 'bei Strings. in meinem Fall die xML-Zeichenfolge bereits hatte' '' \ n''' und das Einrücken war nicht der Fall. –

35

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

Ich weiß nicht, ob ich es vor serializer.startDocument(encoding, standalone) steckte oder es gab einen Fehler mit Sachen, die nicht auf die .xml-Erstellung bezogen sind!

Danke Jungs!

+0

wie Kommentare einrücken dann? – accuya

1

Ich wollte nur eine Notiz machen, dass Transformer.setOutputProperties(Properties) scheint nicht für mich zu arbeiten (1.6.0_26_b03), aber Transformer.setOutputProperty(String,String) funktioniert perfekt.
Wenn Sie ein Properties-Objekt haben, müssen Sie möglicherweise die Ausgabeeigenschaft iterieren und individuell festlegen, damit sie funktioniert.

Verwandte Themen