Java: comment indenter le XML généré par Transformer

J’utilise le transformateur XML intégré à Java pour prendre un document DOM et imprimer le XML résultant. Le problème est que le texte n’est pas indenté malgré le paramétrage explicite du paramètre “indent”.

exemple de code

public class TestXML { public static void main(Ssortingng 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 Ssortingng(s.toByteArray())); } } 

résultat

  

résultat désiré

     

Pensées?

Vous devez activer ‘INDENT’ et définir le montant de retrait pour le transformateur:

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

Mettre à jour:


Référence: Comment supprimer les nœuds de texte des espaces uniquement d’un DOM avant la sérialisation?

(Merci à tous les membres, en particulier @ marc-novakowski, @ james-murty et @saad) :

Aucune des solutions suggérées n’a fonctionné pour moi. J’ai donc continué à chercher une solution alternative, qui a fini par être un mélange des deux précédentes et une troisième étape.

  1. définir le numéro d’indentation dans le transformateur
  2. activer le retrait dans le transformateur
  3. envelopper le otuputstream avec un écrivain (ou un bufferedwriter)
 //(1) TransformerFactory tf = TransformerFactory.newInstance(); tf.setAtsortingbute("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")); 

Vous devez faire (3) pour contourner un comportement “buggy” du code de gestion xml.

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

(Si j’ai mal cité ma source, merci de me le faire savoir)

Le code suivant fonctionne pour moi avec Java 7. Je définis le retrait (oui) et le retrait (2) sur le transformateur (pas l’usine du transformateur) pour le faire fonctionner.

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

La solution de @ mabac pour définir l’atsortingbut n’a pas fonctionné pour moi, mais le commentaire de @ lapo s’est avéré utile.

import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory

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

Si vous souhaitez l’indentation, vous devez le spécifier dans TransformerFactory .

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

J’ai utilisé la bibliothèque Xerces (Apache) au lieu de jouer avec Transformer. Une fois la bibliothèque ajoutée, ajoutez le code ci-dessous.

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

Pour moi, l’ajout de DOCTYPE_PUBLIC fonctionné:

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