2010-04-03 19 views
1

Je voudrais sérialiser un modèle de données simple en XML, j'ai utilisé le code standard java.org.w3c (voir ci-dessous), l'indentation est meilleure que pas "OutputKeys.INDENT", mais il reste une petite chose qui reste - une indentation correcte pour les éléments enfants.Sortie XML Java - indentation correcte pour les éléments enfants

Je sais que cela a été demandé avant on stackoverflow, mais cette configuration ne fonctionne pas pour moi, c'est le code que je utilise:

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.newDocument(); 

     doc = addItemsToDocument(doc); 
     // The addItemsToDocument method adds childElements to the document. 

     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     transformerFactory.setAttribute("indent-number", new Integer(4)); 
     // switching to setAttribute("indent-number", 4); doesn't help 

     Transformer transformer = transformerFactory.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(outFile); 
     // outFile is a regular File outFile = new File("some/path/foo.xml"); 

     transformer.transform(source, result); 

La sortie produite est:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<stuffcontainer> 
<stuff description="something" duration="240" title="abc"> 
<otherstuff /> 
</stuff> 
</stuffcontainer> 

Alors que je voudrais (pour plus de clarté) comme:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<stuffcontainer> 
    <stuff description="something" duration="240" title="abc"> 
    <otherstuff /> 
    </stuff> 
</stuffcontainer> 

je me demande Si c'est possible, faites-le correctement en retrait pour les éléments enfants.

Merci d'avance!
Joyeux Pâques codage :-)!

+0

double possible de [Jolie -impression sortie de javax.xml.transform.Transformer avec seulement api java standard (positionnement Indentation et Doctype)] (https://stackoverflow.com/questions/1264849/pretty-printing-output-from-javax-xml-transform- transformateur-avec-seulement- standard-j) –

Répondre

13

Si la mise en œuvre du transformateur que vous utilisez est Xalan-J, alors vous devriez être en mesure d'utiliser:

transformer.setOutputProperty(
    "{http://xml.apache.org/xslt}indent-amount", "5"); 

Voir aussi: http://xml.apache.org/xalan-j/usagepatterns.html

+0

Merci, ça a très bien marché! – Dr1Ku

+1

Voir là-bas, réponse plus complète: http://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java – Benj

1
Document doc; 

..... 

TransformerFactory factory = TransformerFactory.newInstance(); 
Transformer transformer = factory.newTransformer(); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 
transformer.transform(new DOMSource(doc), new StreamResult(new File("filename.xml"))); 
transformer.transform(new DOMSource(doc), new StreamResult(System.out)); 
+1

Op a déclaré que cela ne fonctionne pas pour lui ... Consultez le lien dans la question. – Syon

+2

Dans mon cas cela fonctionne bien ... il semble que le problème a été résolu plus tard dans la bibliothèque https://bugs.openjdk.java.net/browse/JDK-5064280 corrigé le problème –

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

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "4"); 
+0

ne devrait pas relayer sur com.sun. * paquets dans votre code. Pour plus d'informations, consultez le lien. [link] (http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html) – user2478236