एक org.w3c.dom.Dddment को stdout करने के लिए सुंदर प्रिंट करने का सबसे छोटा तरीका क्या है?


103

सुंदर प्रिंट करने के लिए सबसे आसान तरीका क्या है (उर्फ स्वरूपित) ए org.w3c.dom.Documentटू स्टडआउट?

जवाबों:


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 दस्तावेज़ को प्रिंट करने का "सबसे आसान" तरीका है?
थॉमस

7
दूसरी ओर आपके पास बहुत नियंत्रण है;)
Bozho

2
प्रतिभाशाली! और हाँ, यह थोड़ा बहुत पाठ है लेकिन यह स्पष्ट है कि चयनित विकल्प क्या हैं और एक्लिप्स / नेटबीन्स वास्तव में आपको यह लिखने में मदद करते हैं। मुझे एक छोटा संस्करण दिखाएं और मैं आपको बताता हूं कि यह क्या नहीं कर सकता है। इससे भी बदतर, मैं आपको बताऊंगा कि आपको इसे सही करने के लिए 3 डिबगिंग राउंड की आवश्यकता कहां है ...
पीटर क्रिएन्स

4
मैं भगवान जावा की कसम खाता हूँ .. मुझे कुछ के लिए कोड की हास्यास्पद संख्या लिखिए जो एक या दो अन्य भाषाओं में हो सकती है ... पूर्ण नियंत्रण के साथ भी ..
l46kok

लेकिन अगर आपके XML में सूक्ष्म अक्षर हैं, और आप Xalan का उपयोग कर रहे हैं, तो मुद्दों पर ध्यान दें ।apache.org/ jira/browse/ XALANJ - 2419 और इसके अलावा stackoverflow.com/a/11987283/1031689
जेसनहल्यूटेक्स

13

कैसा रहेगा:

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

8
आसान होते हुए, इस दृष्टिकोण के लिए
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
मैं सराहना करता हूं कि क्यू सबसे कम समय के लिए पूछता है, लेकिन (किसी और के लाभ के लिए) शायद आप अपने उत्तर को विस्तार से बता सकें कि यह क्या है?
एंड्रयू

html -> सिर -> मेटा -> शीर्षक -> शरीर -> यदि मैं स्ट्रिंग का स्थान रखता हूं जैसा कि ऊपर स्पेसर है परिणाम है जो मुझे मिलता है। क्या ऐसा करने का इरादा है? एक्सएमएल का एक पूर्ण प्रिंट वह है जो मुझे लगता है कि जब यह बहुत प्रिंट का मतलब है की जरूरत है।
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);
}

यह बहुत अधूरा है।
एंड्रयू

-1

यदि आप dom4j का उपयोग करते हैं, तो यह dom4JDOM.asString () होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.