একটি org.w3c.dom.Docament এ স্ট্যান্ডআউট প্রিন্ট করার সবচেয়ে সংক্ষিপ্ততম উপায় কী?


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এটি alচ্ছিক, এবং আপনার নির্দিষ্ট কনফিগারেশনের সাথে কাজ নাও করতে পারে)


64
জাভাতে কোনও এক্সএমএল ডকুমেন্ট মুদ্রণের জন্য এটি "সহজতম" উপায়টি কি বিদ্রূপ নয়?
টমাস

7
অন্যদিকে আপনার প্রচুর নিয়ন্ত্রণ রয়েছে;)
বোঝো

2
উজ্জ্বল! এবং হ্যাঁ, এটি কিছুটা পাঠ্য কিন্তু এটি নির্বাচিত বিকল্পগুলি কী তা স্ফটিক স্পষ্ট এবং গ্রহ / নেটবিয়ান আপনাকে এটি লিখতে সত্যই সহায়তা করে। আমাকে একটি ছোট সংস্করণ দেখান এবং আমি আপনাকে বলি যে এটি কী করতে পারে না। সবচেয়ে খারাপ, আমি আপনাকে বলব এটি সঠিক করার জন্য আপনার যেখানে 3 ডিবাগিং রাউন্ড দরকার ...
পিটার ক্রিয়েন্স

4
আমি জাভা দেবতার শপথ করছি .. আমাকে এমন কিছু কোডের জন্য হাস্যকর কোডের লাইন লিখুন যা অন্য ভাষায় এক বা
দু'এই করা

কিন্তু যদি আপনার XML নাক্ষত্রিক অক্ষর রয়েছে, এবং আপনি Xalan ব্যবহার করছেন, নোট issues.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
সহজ হওয়ার পরেও এই পদ্ধতির জন্য জেরেস প্রয়োজন
পেস

3
আমি যোগ করতে পারি যে আজ এক্সএমএলসিরালাইজার এবং আউটপুট ফর্ম্যাট অবমূল্যায়ন করা হয়েছে
ভোকাইল

9

একটি লাইনার সহ জ্যাকবি-এক্সএমএল চেষ্টা করুন :

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
আমি প্রশংসা করি যে প্রশ্নটি সবচেয়ে কম সময়ের জন্য জিজ্ঞাসা করেছে, তবে (অন্য কারও সুবিধার জন্য) সম্ভবত আপনি কী উত্তর দিচ্ছেন তা ব্যাখ্যা করার জন্য আপনার উত্তরটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
অ্যান্ড্রু

এইচটিএমএল -> মাথা -> মেটা -> শিরোনাম -> বডি -> যদি আমি উপরের স্পেসার হিসাবে স্ট্রিংয়ের একটি স্পেস রাখি তবে ফলাফলটিই আমি পাই। এটা কি এর উদ্দেশ্য কি? এক্সএমএল-এর একটি সম্পূর্ণ মুদ্রণ হ'ল আমার মনে হয় এটি যখন প্রিন্ট করা ভাল লাগে ants
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 ()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.