Estou usando o transformador XML integrado do Java para pegar um documento DOM e imprimir o XML resultante. O problema é que ele não está recuando o texto, apesar de ter definido o parâmetro "recuar" explicitamente.
Código de amostra
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 desejado
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
<b/>
</a>
Pensamentos?
java
xml
transform
indentation
Mike
fonte
fonte
INDENT=yes
eu também tive que adicionar isso:t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
org.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT
Nenhuma das soluções sugeridas funcionou para mim. Continuei então em busca de uma solução alternativa, que acabou sendo uma mistura das duas antes mencionadas e uma terceira etapa.
Você deve fazer (3) para contornar um comportamento "bugado" do código de tratamento xml.
Fonte: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446
(Se eu citei minha fonte incorretamente, por favor me avise)
fonte
TransformerFactory
realmente é para que os outros saibam.Writer
como saída, é essencial.O código a seguir está funcionando para mim com o Java 7. Eu defino o recuo (sim) e o valor de recuo (2) no transformador (não na fábrica do transformador) para fazê-lo funcionar.
A solução de @mabac para definir o atributo não funcionou para mim, mas o comentário de @ lapo se mostrou útil.
fonte
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory
fonte
Se você quiser o recuo, você deve especificá-lo para o
TransformerFactory
.fonte
Usei a biblioteca Xerces (Apache) em vez de mexer com o Transformer. Depois de adicionar a biblioteca, adicione o código abaixo.
fonte
Para mim, adicionar
DOCTYPE_PUBLIC
funcionou:fonte