Cách ngắn nhất để in một org.w3c.dom.Document cho stdout là gì?


103

Cách dễ nhất để in đẹp (còn gọi là định dạng) a org.w3c.dom.Documentto stdout là gì?

Câu trả lời:


186

Gọi printDocument(doc, System.out), nơi phương thức đó trông giống như sau:

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

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


64
Thật là mỉa mai khi đó là cách "dễ nhất" để in một tài liệu XML trong Java?
Thomas

7
Mặt khác, bạn có rất nhiều kiểm soát;)
Bozho

2
Xuất sắc! Và vâng, nó hơi nhiều văn bản nhưng nó rất rõ ràng các tùy chọn đã chọn là gì và Eclipse / Netbeans thực sự giúp bạn viết điều này. Cho tôi xem một phiên bản nhỏ hơn và tôi cho bạn biết nó không thể làm được gì. Tệ hơn nữa, tôi sẽ cho bạn biết nơi bạn cần 3 vòng gỡ lỗi để làm đúng ...
Peter Kriens

4
Tôi thề với thần Java .. làm cho tôi viết số vô lý của dòng mã cho một cái gì đó có thể được thực hiện trong một hoặc hai trong các ngôn ngữ khác ... với kiểm soát hoàn toàn quá ..
l46kok

Nhưng nếu XML của bạn chứa các ký tự astral, và bạn đang sử dụng Xalan, lưu ý issues.apache.org/jira/browse/XALANJ-2419 và xem thêm stackoverflow.com/a/11987283/1031689
JasonPlutext

13

Làm thế nào về:

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

8
Trong khi dễ dàng hơn, phương pháp này đòi hỏi Xerces
Pace

3
Tôi có thể nói thêm rằng hôm nay XMLSerializer và OutputFormat không được dùng nữa
Vokail

9

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

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

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

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

html -> head -> meta -> title -> body -> Nếu tôi đặt khoảng trắng của chuỗi làm dấu cách ở trên thì kết quả là những gì tôi nhận được. Nó có phải là những gì nó dự định làm? Tôi nghĩ rằng cần có một bản in đầy đủ của XML khi nó được in ra khá đẹp.
jeraldfdo

0

Điều này sẽ trả về một đầu ra được định dạng độc đáo bằng cách sử dụng đi xuống / đi xuống đệ quy.

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

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

-1

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.