2010-02-24 9 views

Trả lời

160

Gọi printDocument(doc, System.out), nơi phương pháp mà trông như thế này:

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

(Các indent-amount là tùy chọn và có thể không hoạt động với cấu hình cụ thể của bạn)

+56

Không phải là nó mỉa mai rằng đó là "dễ nhất" cách chỉ đơn giản là in một tài liệu XML trong Java? – Thomas

+7

mặt khác, bạn có nhiều quyền kiểm soát;) – Bozho

+2

Brilliant! Và có, nó là một chút văn bản nhưng nó là tinh thể rõ ràng những gì các tùy chọn được lựa chọn và Eclipse/Netbeans thực sự giúp bạn viết này. Chỉ cho tôi một phiên bản nhỏ hơn và tôi cho bạn biết những gì nó không thể làm được. Tồi tệ hơn, tôi sẽ nói cho bạn biết bạn cần 3 vòng gỡ lỗi để làm đúng ... –

12

Làm thế nào về:

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

Trong khi dễ dàng hơn, cách tiếp cận này yêu cầu 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

Tôi đánh giá cao rằng Q yêu cầu ngắn nhất, nhưng (vì lợi ích của bất kỳ ai khác) có lẽ bạn có thể giải thích câu trả lời của mình giải thích những gì đang xảy ra? – Andrew

9

Hãy thử jcabi-xml với một lớp lót:

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

Đây là sự phụ thuộc bạn cần:

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

này sẽ trả về một đầu ra độc đáo formated bằng cách sử dụng đệ quy gốc/đi lên.

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

Điều này rất không đầy đủ. – Andrew

-1

nếu bạn sử dụng dom4j, nó sẽ là dom4JDOM.asString()