Java: как отступить XML, сгенерированный трансформатором
Я использую встроенный в XML-трансформатор Java, чтобы взять документ DOM и распечатать полученный XML. Проблема в том, что он вообще не отступает от текста, несмотря на то, что явно установил параметр "отступ".
пример кода
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()));
}
}
результат
<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>
желаемого результата
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
<b/>
</a>
мысли?
7 ответов:
необходимо включить 'отступ' и установить величину отступа для трансформатора:
t.setOutputProperty(OutputKeys.INDENT, "yes"); t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
обновление:
ссылки : Как удалить только пробелы текстовые узлы из DOM перед сериализацией?
(большое спасибо всем участникам, особенно @marc-novakowski, @james-murty и @saad):
ни одно из предложенных решений работал для меня. Поэтому я продолжал искать альтернативное решение, которое в конечном итоге оказалось смесью двух вышеупомянутых и третьего шага.
- установите номер отступа в transformerfactory
- включить отступ в трансформаторе
- оберните otuputstream с помощью writer (или bufferedwriter)
//(1) TransformerFactory tf = TransformerFactory.newInstance(); tf.setAttribute("indent-number", new Integer(2)); //(2) Transformer t = tf.newTransformer(); t.setOutputProperty(OutputKeys.INDENT, "yes"); //(3) t.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(out, "utf-8"));
вы должны сделать (3), чтобы обойти" багги " поведение обработка xml код.
источник: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446
(Если я неправильно процитировал свой источник, пожалуйста, дайте мне знать)
следующий код работает для меня с Java 7. Я установил отступ (да) и отступ-количество (2) на трансформаторе (а не на трансформаторной фабрике), чтобы заставить его работать.
TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); t.setOutputProperty(OutputKeys.INDENT, "yes"); t.transform(source, result);
решение@mabac для установки атрибута не сработало для меня, но комментарий @lapo оказался полезным.
импортировать com.солнце.орг."Апач".в формате XML.внутренние.сериализатор.OutputPropertiesFactory
transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
Если вы хотите отступ, вы должны указать его в
TransformerFactory
.TransformerFactory tf = TransformerFactory.newInstance(); tf.setAttribute("indent-number", new Integer(2)); Transformer t = tf.newTransformer();
я использовал библиотеку Xerces (Apache) вместо того, чтобы возиться с трансформатором. После добавления библиотеки добавьте код ниже.
OutputFormat format = new OutputFormat(document); format.setLineWidth(65); format.setIndenting(true); format.setIndent(2); Writer outxml = new FileWriter(new File("out.xml")); XMLSerializer serializer = new XMLSerializer(outxml, format); serializer.serialize(document);