2009-09-06 17 views
93
erzeugt wird

Ich benutze Java eingebauten eingebauten Transformator, um ein DOM Dokument zu nehmen und das resultierende XML auszudrucken. Das Problem ist, dass der Text überhaupt nicht eingerückt wird, obwohl der Parameter "Einzug" explizit gesetzt wurde.Java: Wie man XML eingibt, das von Transformer

Beispielcode

public class TestXML { 

public static void main(String args[]) throws Exception { 
    ByteArrayOutputStream s; 

    Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    Transformer t = TransformerFactory.newInstance().newTransformer(); 

    Element a,b; 

    a = d.createElement("a"); 
    b = d.createElement("b"); 

    a.appendChild(b); 

    d.appendChild(a); 

    t.setParameter(OutputKeys.INDENT, "yes"); 

    s = new ByteArrayOutputStream(); 

    t.transform(new DOMSource(d),new StreamResult(s)); 

    System.out.println(new String(s.toByteArray())); 

} 
} 

Ergebnis

<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a> 

gewünschte Ergebnis

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<a> 
<b/> 
</a> 

Gedanken?

Antwort

184

Sie müssen 'SPIEGELSTRICH' ermöglichen und den Einzug Betrag für den Transformator eingestellt:

t.setOutputProperty(OutputKeys.INDENT, "yes"); 
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

Update:


Referenz: How to strip whitespace-only text nodes from a DOM before serialization?

(Vielen Dank an alle Mitglieder besonders @ marc-novakowski, @ james-murty und @saad):

+7

oh Mann * Slams Gesicht in Schreibtisch * dank – Mike

+62

Scheint mir dumm, dass der Standard-Einzug 0 ist, aber zusätzlich zu 'SPIEGELSTRICH = ja "Ich musste auch folgendes hinzufügen:' t.setOutputProperty ("{http://xml.apache.org/xslt}indent-amount", "2"); ' – lapo

+1

Vorsicht. Diese Einrückungseigenschaft funktioniert nicht in Java 5. Es tut in Java 7. Haben Sie nicht in Java versucht 6 – Hilikus

4

Wenn Sie die Einrückung möchten, müssen Sie sie an die TransformerFactory angeben.

TransformerFactory tf = TransformerFactory.newInstance(); 
tf.setAttribute("indent-number", new Integer(2)); 
Transformer t = tf.newTransformer(); 
19

Keine der vorgeschlagenen Lösungen funktionierte für mich. Also suchte ich weiter nach einer alternativen Lösung, die eine Mischung aus den beiden zuvor genannten und einem dritten Schritt war.

  1. eingestellt den Einzug-Nummer in das TransformerFactory
  2. den Einzug in die
  3. wickeln die otuputstream mit einem Schreiber (oder BufferedWriter)
//(1) 
TransformerFactory tf = TransformerFactory.newInstance(); 
tf.setAttribute("indent-number", new Integer(2)); 

//(2) 
Transformer t = tf.newTransformer(); 
t.setOutputProperty(OutputKeys.INDENT, "yes"); 

//(3) 
t.transform(new DOMSource(doc), 
new StreamResult(new OutputStreamWriter(out, "utf-8")); 

Sie Transformator aktivieren muss tun (3) zur Umgehung eines "fehlerhaften" Verhaltens des XML-Code.

Quelle: johnnymac75 @http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446

(Wenn ich meine Quelle falsch zitiert haben, lassen Sie es mich wissen)

+3

Was in der letzten Zeile "out" ist zu? – mujimu

+0

Schritt 1 ist der wichtige –

+0

'indent-Nummer' funktioniert nicht auf Android. – Peterdk

13

Der folgende Code ist für mich die Arbeit mit Java 7. Ich den Einzug gesetzt (ja) und Gedankenstrich -mache (2) am Transformator (nicht am Transformator), damit es funktioniert.

TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer t = tf.newTransformer(); 
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
t.setOutputProperty(OutputKeys.INDENT, "yes"); 
t.transform(source, result); 

@ Lösung des mabac das Attribut gesetzt für mich nicht funktioniert hat, aber Kommentar des @ lapo als hilfreich erwiesen.

+2

das ist die richtige Antwort. –

4

Ich habe die Xerces (Apache) -Bibliothek verwendet, anstatt mich mit Transformer zu beschäftigen. Sobald Sie die Bibliothek hinzugefügt haben, fügen Sie den folgenden Code hinzu.

OutputFormat format = new OutputFormat(document); 
format.setLineWidth(65); 
format.setIndenting(true); 
format.setIndent(2); 
Writer outxml = new FileWriter(new File("out.xml")); 
XMLSerializer serializer = new XMLSerializer(outxml, format); 
serializer.serialize(document); 
+0

Es funktioniert besser, ist aber veraltet. – rghome

+0

Ja. Ich habe alle anderen Ansätze mit dem Transformer versucht, aber alles kaputt. Die ganze W3C-Bibliothek ist ein Durcheinander. Xerces hat funktioniert. – Tuntable

5

importieren Sie com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2"); 
1

Für mich DOCTYPE_PUBLIC Zugabe gearbeitet:

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes"); 
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10"); 
+0

transformer.setOutputProperty (OutputKeys.DOCTYPE_PUBLIC, "Ja"); ist der Schlüssel – sector11

Verwandte Themen