Поскольку вы начинаете с String
, перед тем, как использовать Transformer
, вам нужно скрывать объект DOM
(например, Node
). Однако, если вы знаете, что ваша строка XML действительна и вы не хотите нести накладные расходы на память при разборе строки в DOM, тогда запустите преобразование по DOM, чтобы получить строку обратно - вы могли бы просто сделать несколько старомодных символьный синтаксический анализ. Вставьте новую строку и пробелы после каждого символа </...>
, счетчик keep и indent (чтобы определить количество пробелов), которые вы увеличиваете для каждого <...>
и уменьшаетесь для каждого </...>
, который вы видите.
Отказ от ответственности - Я сделал вырезание / вставку / редактирование текста ниже, поэтому они не могут компилироваться как есть.
public static final Element createDOM(String strXML)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource sourceXML = new InputSource(new StringReader(strXML))
Document xmlDoc = db.parse(sourceXML);
Element e = xmlDoc.getDocumentElement();
e.normalize();
return e;
}
public static final void prettyPrint(Node xml, OutputStream out)
throws TransformerConfigurationException, TransformerFactoryConfigurationError, TransformerException {
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(xml), new StreamResult(out));
}