Was ist der kürzeste Weg, um ein org.w3c.dom.Document auf stdout zu drucken?

103

Was ist der einfachste Weg, um hübsch zu drucken (auch bekannt als formatiert) und org.w3c.dom.Documentzu stdout?

Flybywire
quelle

Antworten:

186

Rufen Sie auf printDocument(doc, System.out), wo diese Methode so aussieht:

public static void printDocument(Document doc, OutputStream out) throws IOException, TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

    transformer.transform(new DOMSource(doc), 
         new StreamResult(new OutputStreamWriter(out, "UTF-8")));
}

(Das indent-amountist optional und funktioniert möglicherweise nicht mit Ihrer speziellen Konfiguration.)

Bozho
quelle
64
Ist es nicht ironisch, dass dies der "einfachste" Weg ist, ein XML-Dokument einfach in Java zu drucken?
Thomas
7
Auf der anderen Seite haben Sie viel Kontrolle;)
Bozho
2
Brillant! Und ja, es ist ein bisschen viel Text, aber es ist kristallklar, welche Optionen ausgewählt wurden, und Eclipse / Netbeans helfen Ihnen wirklich dabei, dies zu schreiben. Zeigen Sie mir eine kleinere Version und ich sage Ihnen, was es nicht kann. Schlimmer noch, ich werde Ihnen sagen, wo Sie 3 Debugging-Runden benötigen, um es richtig zu machen ...
Peter Kriens
4
Ich schwöre bei Gott Java. Lassen Sie mich eine lächerliche Anzahl von Codezeilen für etwas schreiben, das in ein oder zwei Sprachen in anderen Sprachen ausgeführt werden kann. Auch mit voller Kontrolle.
l46kok
Wenn Ihr XML jedoch Astralzeichen enthält und Sie Xalan verwenden, notieren Sie Issues.apache.org/jira/browse/XALANJ-2419 und siehe auch stackoverflow.com/a/11987283/1031689
JasonPlutext
13

Wie wäre es mit:

OutputFormat format = new OutputFormat(doc);
format.setIndenting(true);
XMLSerializer serializer = new XMLSerializer(System.out, format);
serializer.serialize(doc);
Dennis
quelle
8
Dieser Ansatz ist zwar einfacher, erfordert jedoch Xerces
Pace
3
Ich kann hinzufügen, dass heute XMLSerializer und OutputFormat veraltet sind
Vokail
9

Probieren Sie jcabi-xml mit einem Liner aus:

String xml = new XMLDocument(document).toString();

Dies ist die Abhängigkeit, die Sie benötigen:

<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-xml</artifactId>
  <version>0.14</version>
</dependency>
yegor256
quelle
4
private void printNode(Node rootNode, String spacer) {
    System.out.println(spacer + rootNode.getNodeName() + " -> " + rootNode.getNodeValue());
    NodeList nl = rootNode.getChildNodes();
    for (int i = 0; i < nl.getLength(); i++)
        printNode(nl.item(i), spacer + "   ");
}
hannes
quelle
1
Ich weiß es zu schätzen, dass das Q nach dem kürzesten fragt, aber (zum Nutzen anderer) könnten Sie vielleicht Ihre Antwort ausarbeiten, um zu erklären, was los ist?
Andrew
html -> head -> meta -> title -> body -> Wenn ich ein Leerzeichen als Zeichenfolge platziere, ist das Ergebnis das, was ich bekomme. Ist es das, was es tun soll? Ein vollständiger Ausdruck des XML ist das, was ich denke, wenn es ziemlich gedruckt bedeutet.
Jeraldfdo
0

Dies gibt eine schön formatierte Ausgabe zurück, indem rekursiver Abstieg / Aufstieg verwendet wird.

private static boolean skipNL;
private static String printXML(Node rootNode) {
    String tab = "";
    skipNL = false;
    return(printXML(rootNode, tab));
}
private static String printXML(Node rootNode, String tab) {
    String print = "";
    if(rootNode.getNodeType()==Node.ELEMENT_NODE) {
        print += "\n"+tab+"<"+rootNode.getNodeName()+">";
    }
    NodeList nl = rootNode.getChildNodes();
    if(nl.getLength()>0) {
        for (int i = 0; i < nl.getLength(); i++) {
            print += printXML(nl.item(i), tab+"  ");    // \t
        }
    } else {
        if(rootNode.getNodeValue()!=null) {
            print = rootNode.getNodeValue();
        }
        skipNL = true;
    }
    if(rootNode.getNodeType()==Node.ELEMENT_NODE) {
        if(!skipNL) {
            print += "\n"+tab;
        }
        skipNL = false;
        print += "</"+rootNode.getNodeName()+">";
    }
    return(print);
}
Kennzeichen
quelle
Das ist sehr unvollständig.
Andrew
-1

Wenn Sie dom4j verwenden, ist dies dom4JDOM.asString ()

Rockoder
quelle