D'impression sortie de javax.xml.transformer.Transformateur avec seulement la norme api java (Indentation et Doctype positionnement)

En utilisant le code simple suivant:

package test;

import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

public class TestOutputKeys {
    public static void main(String[] args) throws TransformerException {

        //Instantiate transformer input
        Source xmlInput = new StreamSource(new StringReader(
                "<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
        StreamResult xmlOutput = new StreamResult(new StringWriter());

        //Configure transformer
        Transformer transformer = TransformerFactory.newInstance()
                .newTransformer(); //An identity transformer
        transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(xmlInput, xmlOutput);

        System.out.println(xmlOutput.getWriter().toString());
    }

}

- Je obtenir la sortie:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">

<aaa>
<bbb/>
<ccc/>
</aaa>

Question: Le doctype de la balise s'affiche après le document de commentaires. Est-il possible de faire apparaître avant que le document des commentaires?

Question B: Comment puis-je obtenir de l'indentation, en utilisant uniquement les JavaSE 5.0 API?
Cette question est essentiellement identique à La façon dont à-peu-près d'impression xml à partir de java, cependant presque toutes les réponses à cette question dépend de bibliothèques externes. Le seul applicable réponse (posté par un utilisateur nommé Lorenzo Boccaccia) qui n'utilise java de l'api, qui est essentiellement égal au code affiché ci-dessus, mais ne fonctionne pas pour moi (comme indiqué dans la sortie, je n'ai pas l'indentation).

Je devine que vous avez à régler le montant des espaces à utiliser pour l'indentation, comme beaucoup de réponses à des bibliothèques externes faire, mais je n'arrive pas à trouver où le spécifier dans l'api java. Compte tenu du fait que la possibilité de définir une échancrure à la propriété "oui" existe dans l'api java, il doit être possible d'effectuer l'indentation en quelque sorte. Je ne peux pas comprendre comment.

  • Question n'a pas de sens. Voulez-vous dire "avant" dans la seconde partie?
  • Oui. J'ai édité la question de changer de typo. Je vous remercie.
  • Répéter le commentaire que j'ai fait dans le stackoverflow.com/questions/139076/... - vous pouvez maintenant assez d'impression sans bibliothèques externes. Voir xerces.apache.org/xerces2-j/faq-general.html#faq-6. Oui, c'est un Xerces FAQ, mais la réponse standard couvre les classes du JDK. La première 1.5 mise en œuvre de ces classes avaient beaucoup de questions, mais tout fonctionne bien à partir de 1.6 sur. Copiez le LSSerializer exemple dans la FAQ, hacher les "..." bit et ajouter writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); après la LSSerializer writer = ... ligne.
InformationsquelleAutor Alderath | 2009-08-12