Java XML Output - правильное отступление для дочерних элементов - PullRequest
2 голосов
/ 03 апреля 2010

Я хотел бы сериализовать некоторую простую модель данных в xml, я использую стандартный код, связанный с java.org.w3c (см. Ниже), отступ лучше, чем никакого «OutputKeys.INDENT», но там остается одна маленькая вещь - правильное отступление для дочерних элементов.

Я знаю, что это спрашивалось раньше в stackoverflow , но эта конфигурация у меня не сработала, вот код, который я использую:

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();

        doc = addItemsToDocument(doc);
        // The addItemsToDocument method adds childElements to the document.

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        transformerFactory.setAttribute("indent-number", new Integer(4));
        // switching to setAttribute("indent-number", 4); doesn't help

        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

         DOMSource source = new DOMSource(doc);
       StreamResult result = new StreamResult(outFile);
        // outFile is a regular File outFile = new File("some/path/foo.xml");

        transformer.transform(source, result);

Полученная продукция:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<stuffcontainer>
<stuff description="something" duration="240" title="abc">
<otherstuff />
</stuff>
</stuffcontainer>

Принимая во внимание, что я хотел бы это (для большей ясности) как:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<stuffcontainer>
  <stuff description="something" duration="240" title="abc">
    <otherstuff />
  </stuff>
</stuffcontainer>

Мне просто интересно, есть ли способ сделать это, сделать его соответствующим образом с отступом для дочерних элементов.

Заранее спасибо!
Счастливой Пасхи кодирование :-)!

Ответы [ 3 ]

15 голосов
/ 03 апреля 2010

Если используемой реализацией Transformer является Xalan-J, то вы должны иметь возможность использовать:

transformer.setOutputProperty(
   "{http://xml.apache.org/xslt}indent-amount", "5");

Смотри также: http://xml.apache.org/xalan-j/usagepatterns.html

2 голосов
/ 06 ноября 2014
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "4");
1 голос
/ 16 сентября 2014
Document doc;

.....

TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc), new StreamResult(new File("filename.xml")));
transformer.transform(new DOMSource(doc), new StreamResult(System.out));
...