105 votes

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 du tout indenté, bien que j'aie explicitement défini le paramètre "indent".

exemple de code

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

 }
}

résultat

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

résultat souhaité

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

Qu'en pensez-vous ?

208voto

AVD Points 57984

Vous devez activer 'INDENT' et définir la quantité d'indentation pour le transformateur :

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

Mise à jour :


Référence : Comment retirer les nœuds de texte avec espacement des blancs d'un DOM avant la sérialisation ?

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

19voto

mabac Points 526

Aucune des solutions proposées n'a fonctionné pour moi. J'ai donc continué à chercher une solution alternative, qui s'est avérée être un mélange des deux solutions précédentes et d'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 flux d'entrée avec un écrivain (ou un écrivain tampon)

    //(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"));

Vous devez faire (3) pour contourner un comportement "bogué" du code de gestion du code de traitement du xml.

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

(Si j'ai cité ma source de manière incorrecte, veuillez me le faire savoir)

14voto

remipod Points 1243

Le code suivant fonctionne pour moi avec Java 7. J'ai défini l'indentation (oui) et le montant de l'indentation (2) sur le transformateur (pas sur la fabrique 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'attribut n'a pas fonctionné pour moi, mais le commentaire de @lapo s'est avéré utile.

5voto

lucbelanger Points 77

Si vous voulez l'indentation, vous devez la spécifier à la balise TransformerFactory .

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

4voto

sevensevens Points 606

J'ai utilisé la bibliothèque Xerces (Apache) au lieu de m'embêter avec Transformer. Une fois que vous avez ajouté la bibliothèque, 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X