Java: Comment indenter XML Généré par Transformer


J'utilise le transformateur XML intégré de Java pour prendre un document DOM et imprimer le XML résultant. Le problème est qu'il n'indente pas du tout le texte bien qu'il ait défini explicitement le paramètre "indentation".

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>

Pensées?

Author: Mike, 2009-09-06

7 answers

Vous devez activer 'INDENT' et définir le montant du retrait pour le transformateur:

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

Mise à jour:


Référence: Comment supprimer les nœuds de texte à espaces blancs d'un DOM avant la sérialisation?

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

 198
Author: adatapost, 2017-05-23 12:09:57

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édemment mentionnés et une troisième étape.

  1. définissez le numéro de retrait dans la transformerfactory
  2. activer le retrait dans le transformateur
  3. encapsuler l'otuputstream avec un writer (ou 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"));

Vous devez faire (3) pour contourner un comportement "bogué" du code de gestion 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)

 19
Author: mabac, 2012-07-03 23:52:07

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

 14
Author: remipod, 2014-03-04 17:57:30

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

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
 8
Author: , 2014-11-06 14:41:59

Si vous voulez l'indentation, vous devez le spécifier au TransformerFactory.

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();
 4
Author: lucbelanger, 2009-12-04 21:39:00

J'ai utilisé la bibliothèque Xerces (Apache) au lieu de jouer 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);
 4
Author: sevensevens, 2013-05-06 18:56:29

Pour moi, l'ajout de DOCTYPE_PUBLIC a fonctionné:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");
 2
Author: Vikas Chowdhury, 2016-08-12 12:31:58