Używam wbudowanego w Javę transformatora XML, aby wziąć dokument DOM i wydrukować wynikowy XML. Problem polega na tym, że w ogóle nie wcina się tekstu, pomimo jawnego ustawienia parametru „indent”.
przykładowy kod
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()));
}
}
wynik
<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>
pożądany rezultat
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
<b/>
</a>
Myśli?
java
xml
transform
indentation
Mikrofon
źródło
źródło
INDENT=yes
musiałem też dodać to:t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
org.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT
Żadne z sugerowanych rozwiązań nie zadziałało. Kontynuowałem więc poszukiwanie alternatywnego rozwiązania, które okazało się połączeniem dwóch wcześniej wspomnianych i trzeciego kroku.
Musisz (3) obejść "błędne" zachowanie kodu obsługującego XML.
Źródło: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446
(Jeśli nieprawidłowo zacytowałem moje źródło, daj mi znać)
źródło
TransformerFactory
właściwie jest, aby inni wiedzieli.Writer
jako wyjścia, jest niezbędny.Poniższy kod działa dla mnie z Javą 7. Ustawiłem wcięcie (tak) i wielkość wcięcia (2) na transformatorze (nie fabryce transformatorów), aby działał.
Rozwiązanie @ mabac do ustawiania atrybutu nie działało w moim przypadku, ale komentarz @ lapo okazał się pomocny.
źródło
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory
źródło
Jeśli chcesz wcięcia, musisz określić je jako
TransformerFactory
.źródło
Użyłem biblioteki Xerces (Apache) zamiast bawić się Transformerem. Po dodaniu biblioteki dodaj poniższy kod.
źródło
U mnie dodanie
DOCTYPE_PUBLIC
zadziałało:źródło