Usando el siguiente código simple:Pretty-impresión de salida de javax.xml.transform.Transformer con api único estándar java (sangría y posicionamiento Doctype)
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());
}
}
consigo la salida:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
Pregunta A: la etiqueta doctype aparece después del comentario del documento. ¿Es posible hacer que aparezca antes del comentario del documento?
Pregunta B: ¿Cómo logro la indentación, usando solo la API de JavaSE 5.0? Esta pregunta es esencialmente idéntica a How to pretty-print xml from java, , sin embargo, casi todas las respuestas en esa pregunta dependen de las bibliotecas externas. La única respuesta aplicable (publicada por un usuario llamado Lorenzo Boccaccia) que solo utiliza la API de Java, es básicamente igual al código publicado anteriormente, pero no funciona para mí (como se muestra en la salida, no recibo sangría).
Supongo que tiene que establecer la cantidad de espacios para usar para la sangría, como lo hacen muchas de las respuestas con bibliotecas externas, pero no puedo encontrar dónde especificar eso en la API de Java. Dado el hecho de que la posibilidad de establecer una propiedad de sangría a "sí" existe en la API java, debe ser posible realizar sangría de alguna manera. Simplemente no puedo entender cómo.
La pregunta A no tiene sentido. ¿Te refieres a "antes" en la segunda parte? –
Sí. Edité la pregunta para cambiar el error tipográfico. Gracias. – Alderath
Repitiendo el comentario que hice en http://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java - ahora puede imprimir bastante sin bibliotecas externas. Ver http://xerces.apache.org/xerces2-j/faq-general.html#faq-6. Sí, esta es una pregunta frecuente de Xerces, pero la respuesta abarca las clases estándar de JDK. La implementación 1.5 inicial de estas clases tenía muchos problemas, pero todo funciona bien desde 1.6 en adelante. Copie el ejemplo de LSSerializer en las preguntas frecuentes, corte el bit "..." y agregue 'writer.getDomConfig(). SetParameter (" format-pretty-print ", Boolean.TRUE);' después del 'LSSerializer writer = ... 'línea. –