Output di stampa grazioso da javax.xml.transform.Transformsr con solo java api standard (posizionamento di Indentation e Doctype)

Utilizzando il seguente codice semplice:

package test; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; public class TestOutputKeys { public static void main(String[] args) throws TransformsrException { // Instantiate transformsr input Source xmlInput = new StreamSource(new StringReader( "")); StreamResult xmlOutput = new StreamResult(new StringWriter()); // Configure transformsr Transformsr transformsr = TransformsrFactory.newInstance() .newTransformsr(); // An identity transformsr transformsr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd"); transformsr.setOutputProperty(OutputKeys.INDENT, "yes"); transformsr.transform(xmlInput, xmlOutput); System.out.println(xmlOutput.getWriter().toString()); } } 

Ottengo l’output:

       

Domanda A: il tag doctype viene visualizzato dopo il commento del documento. È ansible farlo apparire prima del commento del documento?

Domanda B: Come ottengo indentazione, usando solo l’API JavaSE 5.0? Questa domanda è essenzialmente identica a Come stampare piuttosto xml da java , tuttavia quasi tutte le risposte in quella domanda dipendono da librerie esterne. L’unica risposta applicabile (pubblicata da un utente di nome Lorenzo Boccaccia) che utilizza solo l’API di java, è sostanzialmente uguale al codice pubblicato sopra, ma non funziona per me (come mostrato nell’output, non ottengo indentazione).

Sto indovinando che devi impostare la quantità di spazi da usare per il rientro, come fanno molte delle risposte con le librerie esterne, ma non riesco proprio a trovare dove specificarlo nella java api. Dato che esiste la possibilità di impostare una proprietà di indentazione su “sì” in java api, in qualche modo deve essere ansible eseguire la rientranza. Non riesco a capire come.