मैं एक org.w3c.dom.Document ऑब्जेक्ट को स्ट्रिंग में कैसे परिवर्तित करूं?


89

मैं एक स्ट्रिंग में org.w3c.dom.Document ऑब्जेक्ट को कनवर्ट करना चाहता हूं। मैं जावा 6 का उपयोग कर रहा हूं और किसी भी (पूरी तरह से मुक्त) तकनीक का उपयोग करने के लिए तैयार हूं जो कार्य तक है। मैंने इस धागे से समाधान की कोशिश की - क्या इस कोड की तुलना में जावा में एक XML दस्तावेज़ को स्ट्रिंग में बदलने का एक और अधिक सुंदर तरीका है? , जहां उनके पास है

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)

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

जवाबों:


90

यदि आप परिवर्तन करने के लिए ठीक हैं, तो आप यह कोशिश कर सकते हैं।

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

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

2
मैं ऐसे कोड के लिए एक इकाई परीक्षण नहीं लिखूंगा। आप अपने तर्क से अधिक फ्रेमवर्क प्लंबिंग का परीक्षण करेंगे। जाँच करना कि क्या पाइपलाइन 'कार्य' एकीकरण या अंत-टू-एंड परीक्षण के भाग के रूप में हो सकती है।
एड्रियन कोस्टर

4
काश, इतने बॉयलरप्लेट कोड से बचने का कोई तरीका होता।
१०:३

मुझे कुछ लिंक जैसे "लिंक" टैग में "xmlns" विशेषता मिल रही है। <लिंक href = "my.css" rel = "स्टाइलशीट" प्रकार = "टेक्स्ट / सीएसएस" xmlns = " w3.org/1999/xhtml ">। क्या इससे बचने का कोई उपाय है?
अंकोर_राजपूत

91

किसी चीज का उपयोग करना

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

19
@ मुबशहरअहमदtransformer.setOutputProperty(OutputKeys.INDENT, "yes");
गिलौम

10

यह मेरे लिए इस पृष्ठ पर प्रलेखित है :

TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
StringWriter sw = new StringWriter();
trans.transform(new DOMSource(document), new StreamResult(sw));
return sw.toString();

2

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

  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)फ़ंक्शन को कॉल कर सकते हैं ।

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