2010-02-24 8 views

Antwort

160

Anruf printDocument(doc, System.out), wo das Verfahren wie folgt 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"))); 
} 

(Die indent-amount ist optional und möglicherweise nicht mit Ihrer speziellen Konfiguration)

+56

Ist es nicht ironisch, dass das ist die „einfachste“ Art und Weise einfach ein XML-Dokument in Java drucken? – Thomas

+7

auf der anderen Seite haben Sie viel Kontrolle;) – Bozho

+2

Brilliant! Und ja, es ist ein bisschen viel Text, aber es ist kristallklar, was die ausgewählten Optionen sind und Eclipse/Netbeans helfen Ihnen wirklich dabei, dies zu schreiben. Zeig mir eine kleinere Version und ich sage dir was es nicht kann. Schlimmer noch, ich werde Ihnen sagen, wo Sie 3 Debugging-Runden brauchen, um es richtig zu machen ... –

12

Wie wäre:

OutputFormat format = new OutputFormat(doc); 
format.setIndenting(true); 
XMLSerializer serializer = new XMLSerializer(System.out, format); 
serializer.serialize(doc); 
+7

Während einfacher, erfordert dieser Ansatz Xerces – Pace

1
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 schätze, dass die Q fragt nach dem kürzesten, aber (für den Nutzen von jemand anderem) vielleicht könnten Sie Ihre Antwort zu erarbeiten erklären, was vor sich geht? – Andrew

9

Versuchen Sie jcabi-xml mit einem Liner:

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

Dies ist die Abhängigkeit Sie brauchen:

<dependency> 
    <groupId>com.jcabi</groupId> 
    <artifactId>jcabi-xml</artifactId> 
    <version>0.14</version> 
</dependency> 
1

Dies wird eine schön formatierte Ausgabe zurückkehren durch rekursive Abstieg/Aufstieg mit.

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

Dies ist sehr unvollständig. – Andrew

-1

wenn Sie dom4j verwenden, wäre es dom4JDOM.asString sein()

Verwandte Themen