1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public class PrettyOutput {
public static void main(String... args) throws IOException, JDOMException {
Document doc = new Document();
doc.setRootElement(new Element("a"));
Element b = new Element("b");
doc.getRootElement().addContent(b);
b.setText(" ");
Collection<Element> preserveElements = Arrays.asList(new Element("b"));
prettyOutput(doc, System.out, preserveElements);
}
public static void prettyOutput(Document doc, OutputStream out, Collection<Element> preserveElements) throws JDOMException, IOException {
doc = doc.clone(); // on veut pas forcément modifier le document d'origine
// Protéger les espaces des éléments à préserver
for(Element preserveElement : preserveElements) {
for(Element toPreserve : doc.getDescendants(Filters.element(preserveElement.getName(), preserveElement.getNamespace()))) {
toPreserve.setAttribute("space", "preserve", Namespace.XML_NAMESPACE);
}
}
// première passe : jolie indentation
String firstStage = new XMLOutputter(Format.getPrettyFormat()).outputString(doc);
doc = new SAXBuilder().build(new StringReader(firstStage));
// Enlever les protections
for(Element preserveElement : preserveElements) {
for(Element preserved : doc.getDescendants(Filters.element(preserveElement.getName(), preserveElement.getNamespace()))) {
preserved.removeAttribute("space", Namespace.XML_NAMESPACE);
}
}
// output final
new XMLOutputter().output(doc, out);
}
} |
Partager