?

Log in

No account? Create an account

Previous Entry | Next Entry

Как известно, 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>

Comments

( 2 comments — Leave a comment )
vkotovv
Feb. 28th, 2009 03:01 pm (UTC)
Спасибо!
Помогло! Вышел на Вашу статью через 5 минут гугления :)
zorkus
Feb. 28th, 2009 04:18 pm (UTC)
Re: Спасибо!
Хе -- ну значит записки по ходу действия пригодились кому-то, это очень радует :)
И хорошо что вы сказали тут -- это тоже повышает мой энтузиазм))
( 2 comments — Leave a comment )