Как известно, JAXP позволяет сериализовать XML-ники через тождественную XSLT-
трансформацию. API для работы с XSLT из JAXP называется TrAX (говорящее само за себя
название, правда? :))),
Вот пример кода для сериализации с JAXP/TrAX:
Source domSource = new DOMSource(myDOMDocument);
Result fileResult = new StreamResult(new File("outputFile.xml"));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer .setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"no");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(domSource, fileResult);
И вот заодно полезная статья на IBM dev network:
http://www.ibm.com/developerworks/ru/library/x-xjavaforum5/index.htmlПроблема в том, что файлы, которые генерит такой код, будут выглядить
примерно так -
<journals>
<opercard>
<operator>UNSET_VALUE</operator>
<date>UNSET_VALUE</date>
<cntnode>UNSET_VALUE</cntnode>
<cs>UNSET_VALUE</cs>
</opercard>
</journals>
Поскольку в классе OutputKeys нет стандартных свойств, с помощью которых
можно было бы управлять отступами.
Два решения, которые я нашел после долгого гугления -
trans.setOutputProperty("{
http://xml.apache.org/xslt}indent-amount", "4");
передача свойства дефолтной таблице стилей в транформере.
ИЛИ
TransformerFactory transfac = TransformerFactory.newInstance();
transfac.setAttribute("indent-number", 4);
Передача свойства реализации фабрики трансформера.
После такого хинта транформеру он будет выдавать readable XML вида
<journals>
<opercard>
<operator>UNSET_VALUE</operator>
<date>UNSET_VALUE</date>
<cntnode>UNSET_VALUE</cntnode>
<cs>UNSET_VALUE</cs>
</opercard>
</journals>