2010-02-24 13 views

Respuesta

160

llamada printDocument(doc, System.out), donde ese método es el siguiente:

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

(El indent-amount es opcional, y podría no funcionar con su configuración particular)

+56

¿No es irónico que esa es la forma "más fácil" para imprimir sólo un documento XML en Java? – Thomas

+7

; por otro lado, tiene mucho control;) – Bozho

+2

Brilliant! Y sí, es un poco texto, pero está claro cuáles son las opciones seleccionadas y Eclipse/Netbeans realmente lo ayudan a escribir esto. Muéstrame una versión más pequeña y te digo lo que no puede hacer. Peor aún, le diré dónde necesita 3 rondas de depuración para hacerlo bien ... –

12

¿Qué tal:

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

Aunque es más fácil, este enfoque requiere 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

. Agradezco que la Q solicite la más corta, pero (para el beneficio de cualquier otra persona) quizás pueda elaborar su respuesta a explicar lo que está pasando? – Andrew

9

Pruebe jcabi-xml con un trazador de líneas:

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

Esta es la dependencia que necesita:

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

Esto devolverá una salida muy bien formateado mediante el uso recursivo de descenso/ascenso.

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

Esto es muy incompleto. – Andrew

-1

si utiliza dom4j, sería dom4JDOM.asString()

Cuestiones relacionadas