2012-04-27 15 views
60

मैं एक org.w3c.dom.Document ऑब्जेक्ट को स्ट्रिंग में कनवर्ट करना चाहता हूं। मैं जावा 6 का उपयोग कर रहा हूं और कार्य तक पहुंचने वाली किसी भी (पूरी तरह से मुक्त) तकनीक का उपयोग करने के लिए खुला हूं। मैं इस धागे से समाधान करने की कोशिश की - Is there a more elegant way to convert an XML Document to a String in Java than this code?, जहां वेमैं एक org.w3c.dom.Document ऑब्जेक्ट को स्ट्रिंग में कैसे परिवर्तित करूं?

DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); 
LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
String html = lsSerializer.writeToString(doc); 

है, लेकिन निम्नलिखित खराब अपवाद के साथ स्वागत किया गया था ...

org.w3c.dom.DOMException: DOM method not supported 
    at org.w3c.tidy.DOMDocumentImpl.getImplementation(DOMDocumentImpl.java:129) 
    at com.myco.myproj.cleaners.JTidyCleaner.outputDocAsString(JTidyCleaner.java:74) 
    at com.myco.myproj.cleaners.JTidyCleaner.parse(JTidyCleaner.java:63) 
    at com.myco.myproj.util.NetUtilities.getUrlAsDocument(NetUtilities.java:51) 
    at com.myco.myproj.parsers.AbstractHTMLParser.getEventFromElement(AbstractHTMLParser.java:131) 
    at com.myco.myproj.parsers.AbstractHTMLParser.parsePage(AbstractHTMLParser.java:100) 
    at com.myco.myproj.parsers.AbstractHTMLParser.getEvents(AbstractHTMLParser.java:63) 
    at com.myco.myproj.domain.EventFeed.refresh(EventFeed.java:87) 
    at com.myco.myproj.domain.EventFeed.getEvents(EventFeed.java:72) 
    at com.myco.myproj.parsers.impl.ChicagoCouncilGlobalAffairsParserTest.testParser(ChicagoCouncilGlobalAffairsParserTest.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+0

पहचान परिवर्तन (http://en.wikipedia.org/wiki/Identity_transform) यदि आप किसी प्रकार के एक धारावाहिक पर निर्भर नहीं करना चाहते हैं तो यह आपकी सबसे अच्छी शर्त है। दो जवाब दिए गए हैं जो पहले ही दिए गए हैं। इस तरह एक खाली परिवर्तन चलाना दृश्यों के पीछे पहचान बदलता है। –

उत्तर

61

कुछ बात तो परिवर्तन करना ठीक है, आप इसे आजमा सकते हैं।

DocumentBuilderFactory domFact = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = domFact.newDocumentBuilder(); 
Document doc = builder.parse(st); 
DOMSource domSource = new DOMSource(doc); 
StringWriter writer = new StringWriter(); 
StreamResult result = new StreamResult(writer); 
TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer transformer = tf.newTransformer(); 
transformer.transform(domSource, result); 
System.out.println("XML IN String format is: \n" + writer.toString()); 
+0

उपरोक्त कोड के लिए जुनीट्स लिखना कोई विचार है? मुझे लिखते समय एक सत्यापन त्रुटि मिल रही है। मैंने SO में एक प्रश्न पूछा है, यदि आप उपलब्ध हैं, तो कृपया उत्तर दें। https://stackoverflow.com/q/48560458/5989309 –

68

उपयोग की तरह

import java.io.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.stream.*; 

//method to convert Document to String 
public String getStringFromDocument(Document doc) 
{ 
    try 
    { 
     DOMSource domSource = new DOMSource(doc); 
     StringWriter writer = new StringWriter(); 
     StreamResult result = new StreamResult(writer); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer(); 
     transformer.transform(domSource, result); 
     return writer.toString(); 
    } 
    catch(TransformerException ex) 
    { 
     ex.printStackTrace(); 
     return null; 
    } 
} 
+0

यह काम करता है लेकिन सुंदर प्रिंट कैसे करें: s –

+14

@ मुबारर अहमद 'ट्रांसफॉर्मर.सेटऑटपुटप्रॉपर्टी (आउटपुटकेस इंडेंट, "हां"); ' –

1

ज़ाज़ के उत्तर पर आधारित एक स्कैला संस्करण।

case class DocumentEx(document: Document) { 
    def toXmlString(pretty: Boolean = false):Try[String] = { 
     getStringFromDocument(document, pretty) 
    } 
    } 

    implicit def documentToDocumentEx(document: Document):DocumentEx = { 
    DocumentEx(document) 
    } 

    def getStringFromDocument(doc: Document, pretty:Boolean): Try[String] = { 
    try 
    { 
     val domSource= new DOMSource(doc) 
     val writer = new StringWriter() 
     val result = new StreamResult(writer) 
     val tf = TransformerFactory.newInstance() 
     val transformer = tf.newTransformer() 
     if (pretty) 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes") 
     transformer.transform(domSource, result) 
     Success(writer.toString); 
    } 
    catch { 
     case ex: TransformerException => 
     Failure(ex) 
    } 
    } 
इसी के साथ

, आप या तो doc.toXmlString() करते हैं या getStringFromDocument(doc) समारोह कॉल कर सकते हैं।