Estoy usando el transformador XML integrado de Java para tomar un documento DOM e imprimir el XML resultante. El problema es que no está sangrando el texto en absoluto a pesar de haber establecido el parámetro "sangría" explícitamente.
Código de muestra
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()));
}
}
resultado
<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>
resultado deseado
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
<b/>
</a>
Pensamientos
java
xml
transform
indentation
Miguel
fuente
fuente
INDENT=yes
también tuve que agregar esto:t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
org.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT
Ninguna de las soluciones sugeridas funcionó para mí. Así que seguí buscando una solución alternativa, que terminó siendo una mezcla de las dos antes mencionadas y un tercer paso.
Debe hacer (3) para solucionar un comportamiento "defectuoso" del código de manejo xml.
Fuente: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446
(Si he citado mi fuente incorrectamente, hágamelo saber)
fuente
TransformerFactory
realidad para que otros sepan?Writer
como salida, es esencial.El siguiente código me funciona con Java 7. Establecí la sangría (sí) y la cantidad de sangría (2) en el transformador (no en la fábrica de transformadores) para que funcione.
La solución de @ mabac para establecer el atributo no funcionó para mí, pero el comentario de @ lapo resultó útil.
fuente
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory
fuente
Si desea la sangría, debe especificarla en el
TransformerFactory
.fuente
Usé la biblioteca Xerces (Apache) en lugar de jugar con Transformer. Una vez que agregue la biblioteca, agregue el código a continuación.
fuente
Para mí, la adición
DOCTYPE_PUBLIC
funcionó:fuente