2010-03-18 15 views
41

में कनवर्ट करना चाहता हूं, मैं OutputStream को String ऑब्जेक्ट में कनवर्ट करना चाहता हूं। मेरे पास JAXB ऑब्जेक्ट को मार्शल करने के बाद OutputStream ऑब्जेक्ट लौटा रहा है।मैं आउटपुट स्ट्रीम को स्ट्रिंग ऑब्जेक्ट

उत्तर

85
बहुत, JAXB से परिचित मैं क्या

public String asString(JAXBContext pContext, 
         Object pObject) 
          throws 
           JAXBException { 

    java.io.StringWriter sw = new StringWriter(); 

    Marshaller marshaller = pContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
    marshaller.marshal(pObject, sw); 

    return sw.toString(); 
} 

ws.apache.org

लेकिन मैं एक stirng वस्तु के बारे में यकीन नहीं है का उपयोग कर आप एक स्ट्रिंग में बदल सकते हैं खोजने के लिए सक्षम था से नहीं

। अभी तक ढुंढ रहा हूँ।

** संपादित

एक गैर तत्व

मार्शलिंग एक अन्य आम उपयोग है आप एक वस्तु है कि उस पर @XmlRootElement नहीं है है जहां। JAXB आप इसे इस तरह मार्शल करने के लिए अनुमति देता है:

marshaller.marshal (नई JAXBElement (
नई QName ("", "rootTag"), Point.class, नई प्वाइंट (...)));

यह तत्व को रूट तत्व के रूप में रखता है, उसके बाद ऑब्जेक्ट की सामग्री होती है। आप वास्तव में उस वर्ग के साथ उपयोग कर सकते हैं जो में @XmlRootElement है, और यह कि बस रूट तत्व नाम का नाम बदलता है।

पहली नज़र दूसरा Point.class पैरामीटर निरर्थक लग सकता है पर, लेकिन यह अगर marshaller होगा (कुख्यात) @xsi उत्पादन निर्धारित करने के लिए वास्तव में आवश्यक है: प्रकार। इस उदाहरण में, कक्षा और उदाहरण दोनों बिंदु हैं, इसलिए आपको @xsi नहीं दिखाई देगा: प्रकार। लेकिन अगर वे अलग हैं, आप इसे देखेंगे।

इसका उपयोग स्ट्रिंग या पूर्णांक जैसे सरल ऑब्जेक्ट को मार्शल करने के लिए भी किया जा सकता है।

marshaller.marshal (नई JAXBElement (
नई QName ("", "rootTag"), String.class, "foo बार"));

लेकिन दुर्भाग्य से यह सूची या मानचित्र की तरह मार्शल वस्तुओं के लिए नहीं किया जा सकता है, के रूप में वे JAXB दुनिया में प्रथम श्रेणी के नागरिक के रूप में संभाला नहीं कर रहे हैं।

पाया HERE

+1

बस यहां एक नोट बना रहा है कि स्ट्रिंगवाइटर दृष्टिकोण वास्तव में काम करता है। धन्यवाद! – eis

0
public String readFile(String pathname) throws IOException { 
    File file = new File(pathname); 
    StringBuilder fileContents = new StringBuilder((int) file.length()); 
    Scanner scanner = new Scanner(file); 
    String lineSeparator = System.getProperty("line.separator"); 

    try { 
     while (scanner.hasNextLine()) { 
      fileContents.append(scanner.nextLine() + lineSeparator); 
     } 
     return fileContents.toString(); 
    } 
    finally { 
     scanner.close(); 
    } 
}  

विधि एक्सएमएल संभालने के लिए और यह एक स्ट्रिंग में बदलने के लिए।

JAXBContext jc = JAXBContext.newInstance(ClassMatchingStartofXMLTags.class); 
    Unmarshaller unmarshaller = jc.createUnmarshaller(); 
    //store filepath to be used 
    String filePath = "YourXMLFile.xml"; 
    File xmlFile = new File(filePath); 
    //Set up xml Marshaller 
    ClassMatchingStartofXMLTags xmlMarshaller = (ClassMatchingStartofXMLTags) unmarshaller.unmarshal(xmlFileEdit); 
    Marshaller marshaller = jc.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    // Use marshall to output the contents of the xml file 
    System.out.println("Marshalled XML\n"); 
    marshaller.marshal(xmlMarshaller, System.out); 
    //Use Readfile method to convert the XML to a string and output the results 
    System.out.println("\nXML to String"); 
    String strFile = ReadFile(xmlFile) 
    System.out.println(strFile);  

अपने वर्ग के भीतर विधि एक्सएमएल और मार्शल पाने के लिए यह संपादित उपरोक्त विधि होगा दोनों उत्पादन मार्शल एक्सएमएल और यह भी एक स्ट्रिंग के रूप में xml।

+0

यह बेहद शांत है, और स्पष्ट या उचित जावा नहीं है। मूल लेखक के पास एक एक्सएमएल फ़ाइल हाथ में नहीं है; एक आउटपुटस्ट्रीम को संदर्भित प्रश्न। –

7
StringWriter sw = new StringWriter(); 
    com.integra.xml.Integracao integracao = new Integracao(); 
    integracao.add(...); 
try { 
    JAXBContext context = JAXBContext.newInstance("com.integra.xml"); 
    Marshaller marshaller = context.createMarshaller(); 
    marshaller.marshal(integracao, sw); 
    System.out.println(sw.toString()); 
} catch (JAXBException e) { 
    e.printStackTrace(); 
} 
+1

अब तक का सबसे साफ दृष्टिकोण – xyz

-1

हां, ऐसा करने का एक तरीका है: बस स्ट्रिंग लेखक को इनपुट के रूप में पास करें। ताकि यह बनाया गया एक्सएमएल

public void saveSettings() throws IOException { 
     FileOutputStream os = null; 
     //Declare a StringWriter to which the output has to go 
     StringWriter sw = new StringWriter(); 
     try { 
      Answer ans1=new Answer(101,"java is a programming language","ravi"); 
      Answer ans2=new Answer(102,"java is a platform","john"); 

      ArrayList<Answer> list=new ArrayList<Answer>(); 
      list.add(ans1); 
      list.add(ans2); 

      settings=new Question(1,"What is java?",list); 
      os = new FileOutputStream(FILE_NAME); 
      this.marshaller.marshal(settings, new StreamResult(sw)); 
      System.out.println(sw.toString()); 
      new File(FILE_NAME).delete(); 
     } finally { 
      if (os != null) { 
       os.close(); 
      } 
     } 
    } 
संबंधित मुद्दे