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?

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.)


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);

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>

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 + "   ");
}

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);
}

Das ist sehr unvollständig.
Andrew

-1

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.