วิธีที่สั้นที่สุดในการพิมพ์ org.w3c.dom.Document เป็น stdout ที่สั้นที่สุดคืออะไร


103

วิธีที่ง่ายที่สุดในการพิมพ์สวย (หรือที่จัดรูปแบบ) a org.w3c.dom.Documentto stdout คืออะไร?

คำตอบ:


186

โทรprintDocument(doc, System.out)โดยที่วิธีนั้นมีลักษณะดังนี้:

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-amountเป็นทางเลือกและอาจใช้ไม่ได้กับการกำหนดค่าเฉพาะของคุณ)


64
เป็นเรื่องน่าขันใช่ไหมที่เป็นวิธีที่ "ง่ายที่สุด" ในการพิมพ์เอกสาร XML ใน Java
Thomas

7
ในทางกลับกันคุณมีการควบคุมมากมาย)
Bozho

2
ยอดเยี่ยม! และใช่มันเป็นข้อความที่ค่อนข้างมาก แต่ชัดเจนว่าตัวเลือกที่เลือกคืออะไรและ Eclipse / Netbeans ช่วยคุณเขียนสิ่งนี้ได้จริงๆ แสดงเวอร์ชันที่เล็กกว่าให้ฉันดูและฉันบอกคุณว่ามันทำอะไรไม่ได้ แย่กว่านั้นฉันจะบอกคุณว่าคุณต้องแก้ไขจุดบกพร่อง 3 รอบเพื่อให้ถูกต้อง ...
Peter Kriens

4
ฉันสาบานกับพระเจ้า Java .. ทำให้ฉันเขียนโค้ดจำนวนบรรทัดที่ไร้สาระสำหรับบางสิ่งที่สามารถทำได้ในหนึ่งหรือสองในภาษาอื่น ... ควบคุมได้เต็มรูปแบบด้วย ..
l46kok

แต่ถ้า XML ของคุณมีอักขระ Astral และคุณกำลังใช้ Xalan โปรดสังเกตissue.apache.org/jira/browse/XALANJ-2419และดูที่stackoverflow.com/a/11987283/1031689
JasonPlutext

13

เกี่ยวกับ:

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

8
แม้ว่าจะง่ายกว่า แต่วิธีนี้ต้องใช้ Xerces
Pace

3
ฉันสามารถเพิ่มได้ว่าวันนี้ XMLSerializer และ OutputFormat เลิกใช้งานแล้ว
Vokail

9

ลองjcabi-xmlด้วยซับเดียว:

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

นี่คือการพึ่งพาที่คุณต้องการ:

<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
ฉันขอขอบคุณที่ Q ขอให้สั้นที่สุด แต่ (เพื่อประโยชน์ของคนอื่น) บางทีคุณอาจอธิบายคำตอบของคุณอย่างละเอียดเพื่ออธิบายว่าเกิดอะไรขึ้น?
Andrew

html -> head -> meta -> title -> body -> ถ้าฉันวางช่องว่างของสตริงเป็นตัวเว้นวรรคด้านบนผลลัพธ์คือสิ่งที่ฉันได้รับ เป็นสิ่งที่ตั้งใจจะทำหรือไม่? การพิมพ์ XML เต็มรูปแบบคือสิ่งที่จำเป็นฉันคิดว่าเมื่อมันพิมพ์ออกมาสวย
jeraldfdo

0

สิ่งนี้จะส่งคืนผลลัพธ์ที่ได้รับการจัดรูปแบบอย่างสวยงามโดยใช้การสืบเชื้อสาย / การขึ้นแบบวนซ้ำ

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

สิ่งนี้ไม่สมบูรณ์มาก
Andrew

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.