জাভা অবজেক্টকে এক্সএমএল স্ট্রিংয়ে রূপান্তর করুন


92

হ্যাঁ, হ্যাঁ আমি জানি যে এই বিষয়টি সম্পর্কে প্রচুর প্রশ্ন করা হয়েছিল। তবে আমি এখনও আমার সমস্যার সমাধান খুঁজে পাচ্ছি না। আমার কাছে জাভা অবজেক্টে টিকা আছে এমন একটি সম্পত্তি রয়েছে। উদাহরণস্বরূপ গ্রাহক যেমন উদাহরণস্বরূপ । এবং আমি এটির একটি স্ট্রিং প্রতিনিধিত্ব চাই। গুগল এই জাতীয় উদ্দেশ্যে JAXB ব্যবহার করে পুনরুদ্ধার করে। তবে তৈরি করা সমস্ত উদাহরণে এক্সএমএল ফাইলটি ফাইল বা কনসোলে প্রিন্ট করা হয়, যেমন:

File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);

তবে আমাকে এই অবজেক্টটি ব্যবহার করতে হবে এবং এক্সএমএল ফর্ম্যাটে নেটওয়ার্কের মাধ্যমে পাঠাতে হবে। সুতরাং আমি একটি স্ট্রিং পেতে চাই যা এক্সএমএলকে উপস্থাপন করে।

String xmlString = ...
sendOverNetwork(xmlString);

কিভাবে আমি এটি করতে পারব?

উত্তর:


114

মার্শালিংয়ের জন্য আপনি মার্শেলার পদ্ধতিটি ব্যবহার করতে পারেন যা কোনও লেখককে প্যারামিটার হিসাবে গ্রহণ করে :

মার্শাল (বিষয়, লেখক)

এবং এটি একটি বাস্তবায়ন পাস করুন যা একটি স্ট্রিং অবজেক্ট তৈরি করতে পারে

প্রত্যক্ষ জ্ঞাত সাবক্লাসগুলি: বাফার্ড রাইটার, চরআরাইরাইটার, ফিল্টার রাইটার, আউটপুট স্ট্রিম রাইটার, পাইপড রাইটার, প্রিন্ট রাইটার, স্ট্রিং রাইটার

প্রকৃত স্ট্রিংয়ের মান পেতে তার স্ট্রিং পদ্ধতিতে কল করুন ।

তাই করছেন:

StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(customer, sw);
String xmlString = sw.toString();

4
StringWriterখুব পুরানো। কভারগুলির নীচে এটি ব্যবহার করে StringBufferযেখানে আরও দ্রুত পদ্ধতির ব্যবহার করা হত StringBuilderতবে স্ট্রিং রাইটারটি প্রথম তৈরি করার সময় এটি উপস্থিত ছিল না। এর কারণে প্রতিটি sw.toString()কলই সুসংগতভাবে বোঝায়। খারাপ যদি আপনি পারফরম্যান্স খুঁজছেন।
পিটারহ

4
@ পেটারহ এখানে সমস্ত উত্তর একটি স্ট্রিং রাইটার ব্যবহার করে। এর পরিবর্তে আপনি কী পরামর্শ করবেন?
ক্রিস্টোফার স্নাইডার

4
jaxbMarshaller.setProperty (মার্শালার। JAXB_FORMATTED_OUTPUT, বুলিয়ান। TRUE); এক্সএমএলের সঠিক কাঠামো পেতে এটি ব্যবহার করুন।
দাস প্রকাশ

37

Javax.xML.bind.JAXB ব্যবহার করা একটি সুবিধাজনক বিকল্প :

StringWriter sw = new StringWriter();
JAXB.marshal(customer, sw);
String xmlString = sw.toString();

বিপরীত প্রক্রিয়া (আনমর্শাল) হ'ল:

Customer customer = JAXB.unmarshal(new StringReader(xmlString), Customer.class);

এই পদ্ধতিতে চেক করা ব্যতিক্রমগুলি মোকাবেলা করার দরকার নেই।


এটি কেবলমাত্র
গেটারগুলি

30

A4L উল্লেখ হিসাবে, আপনি স্ট্রিং রাইটার ব্যবহার করতে পারেন। এখানে উদাহরণ কোড সরবরাহ করা হচ্ছে:

private static String jaxbObjectToXML(Customer customer) {
    String xmlString = "";
    try {
        JAXBContext context = JAXBContext.newInstance(Customer.class);
        Marshaller m = context.createMarshaller();

        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML

        StringWriter sw = new StringWriter();
        m.marshal(customer, sw);
        xmlString = sw.toString();

    } catch (JAXBException e) {
        e.printStackTrace();
    }

    return xmlString;
}

স্ট্রিং রাইটার এম.মর্শাল (গ্রাহক, সিস্টেম.আউট) এর কোনও প্রয়োজন নেই;
দিমিত্রি জিআর

6

আপনি এটিকে মার্শাল করতে পারেন StringWriterএবং এর স্ট্রিংটি ধরতে পারেন । থেকে toString()


@ কিকবাট্টোভস্কি: উত্তরের প্রয়োজনীয় অংশটি কেবল একটি ব্যবহার করা StringWriter। লিঙ্কটি কেবলমাত্র ডকুমেন্টেশন।
এসএলএক্স

দয়া করে কিছু ব্যাখ্যা যুক্ত করুন এবং আনন্দের সাথে আমি আমার ডাউন ভোটটি সরিয়ে দেব। :) পাশে আপনি এটি একটি মন্তব্য হিসাবে রাখতে পারেন
কিক বাট্টোস্কি

আপনি এটির উদাহরণ ব্যবহার করতে পারেন?
বব

@ Bob: একটি তৈরি করুন StringWriter, এটিকে পাস করুন marshal(), কল করুন toString()
এসএলএক্স

4
@ উত্তর এই উত্তর আসলে যথেষ্ট। দয়া করে এপিআইগুলি কীভাবে গবেষণা করবেন তা শিখুন, এই উদাহরণে Marshallerকয়েকটি মার্শাল ওভারলোডেড পদ্ধতি রয়েছে, কেবল তাদের প্যারামিটারগুলি এবং সেগুলি কী তা দেখুন এবং আপনি উত্তরটি খুঁজে পাবেন find
এল

3

জাভাতে কোনও অবজেক্টকে এক্সএমএলে রূপান্তর করতে

গ্রাহক। জাভা

package com;

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
*
* @author ABsiddik
*/

@XmlRootElement
public class Customer {

int id;
String name;
int age;

String address;
ArrayList<String> mobileNo;


 public int getId() {
    return id;
}

@XmlAttribute
public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

@XmlElement
public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

@XmlElement
public void setAge(int age) {
    this.age = age;
}

public String getAddress() {
    return address;
}

@XmlElement
public void setAddress(String address) {
    this.address = address;
}

public ArrayList<String> getMobileNo() {
    return mobileNo;
}

@XmlElement
public void setMobileNo(ArrayList<String> mobileNo) {
    this.mobileNo = mobileNo;
}


}

রূপান্তর করুনবিজেটিওএক্সএল.এম.ভা

package com;

import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

/**
*
* @author ABsiddik
*/
public class ConvertObjToXML {

public static void main(String args[]) throws Exception
{
    ArrayList<String> numberList = new ArrayList<>();
    numberList.add("01942652579");
    numberList.add("01762752801");
    numberList.add("8800545");

    Customer c = new Customer();

    c.setId(23);
    c.setName("Abu Bakar Siddik");
    c.setAge(45);
    c.setAddress("Dhaka, Bangladesh");
    c.setMobileNo(numberList);

    File file = new File("C:\\Users\\NETIZEN-ONE\\Desktop \\customer.xml");
    JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    jaxbMarshaller.marshal(c, file);// this line create customer.xml file in specified path.

    StringWriter sw = new StringWriter();
    jaxbMarshaller.marshal(c, sw);
    String xmlString = sw.toString();

    System.out.println(xmlString);
}

}

এই উদাহরণ দিয়ে চেষ্টা করুন ..


2

জাভা অবজেক্টকে এক্সএমএলে রূপান্তর করতে জাভা কোডটি পরীক্ষা করা এবং কাজ করা:

গ্রাহক। জাভা

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement
public class Customer {

    String name;
    int age;
    int id;
    String desc;
    ArrayList<String> list;

    public ArrayList<String> getList()
    {
        return list;
    }

    @XmlElement
    public void setList(ArrayList<String> list)
    {
        this.list = list;
    }

    public String getDesc()
    {
        return desc;
    }

    @XmlElement
    public void setDesc(String desc)
    {
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }
}

createXML.java

import java.io.StringWriter;
import java.util.ArrayList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;


public class createXML {

    public static void main(String args[]) throws Exception
    {
        ArrayList<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        Customer c = new Customer();
        c.setAge(45);
        c.setDesc("some desc ");
        c.setId(23);
        c.setList(list);
        c.setName("name");
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter sw = new StringWriter();
        jaxbMarshaller.marshal(c, sw);
        String xmlString = sw.toString();
        System.out.println(xmlString);
    }

}

সাধারণত উত্তরগুলি যুক্ত করুন যাতে কেবল কোড অন্তর্ভুক্ত থাকে এবং কোনও ব্যাখ্যাই
অগ্রাহ্য

1

বাইটআরআউটপুট স্ট্রিম ব্যবহার করা

public static String printObjectToXML(final Object object) throws TransformerFactoryConfigurationError,
        TransformerConfigurationException, SOAPException, TransformerException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    XMLEncoder xmlEncoder = new XMLEncoder(baos);
    xmlEncoder.writeObject(object);
    xmlEncoder.close();

    String xml = baos.toString();
    System.out.println(xml);

    return xml.toString();
}

1

আমি JAXB.marshal বাস্তবায়ন গ্রহণ করেছি এবং এক্সএলএমএল প্রোলোগুলি অপসারণ করতে jaxb.fraament = সত্য যোগ করেছি। এই পদ্ধতিটি XMLRootElement টিকা ছাড়াই এমনকি অবজেক্টগুলি পরিচালনা করতে পারে। এটি চেক করা ডেটাবাইন্ডিং এক্সসেপশনটিও ছুঁড়ে দেয়।

public static String toXmlString(Object o) {
    try {
        Class<?> clazz = o.getClass();
        JAXBContext context = JAXBContext.newInstance(clazz);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output

        final QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
        JAXBElement jaxbElement = new JAXBElement(name, clazz, o);

        StringWriter sw = new StringWriter();
        marshaller.marshal(jaxbElement, sw);
        return sw.toString();

    } catch (JAXBException e) {
        throw new DataBindingException(e);
    }
}

যদি সংকলক সতর্কতা আপনাকে বিরক্ত করে, তবে এখানে দুটি প্যারামিটার সংস্করণ বর্ণিত।

public static <T> String toXmlString(T o, Class<T> clazz) {
    try {
        JAXBContext context = JAXBContext.newInstance(clazz);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output

        QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
        JAXBElement jaxbElement = new JAXBElement<>(name, clazz, o);

        StringWriter sw = new StringWriter();
        marshaller.marshal(jaxbElement, sw);
        return sw.toString();

    } catch (JAXBException e) {
        throw new DataBindingException(e);
    }
}

0

এক্সএমএল স্ট্রং তৈরি করতে কিছু জেনেরিক কোড

অবজেক্ট -> এটি জাভা বর্গ যা এটিকে XML নামে রূপান্তর করতে পারে
-> পার্থক্যের জন্য কেবল নামের মতো স্থান

public static String convertObjectToXML(Object object,String name) {
          try {
              StringWriter stringWriter = new StringWriter();
              JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
              Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
              jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
              QName qName = new QName(object.getClass().toString(), name);
              Object root = new JAXBElement<Object>(qName,java.lang.Object.class, object);
              jaxbMarshaller.marshal(root, stringWriter);
              String result = stringWriter.toString();
              System.out.println(result);
              return result;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

0

মার্শালিং এবং আনমারশালিং অবজেক্টগুলির জন্য এখানে একটি ব্যবহার শ্রেণি রয়েছে। আমার ক্ষেত্রে এটি একটি নেস্টেড ক্লাস ছিল, তাই আমি এটিকে স্থির জ্যাকএক্সবিটিস বানিয়েছি।

import javax.xml.bind.JAXB;
import java.io.StringReader;
import java.io.StringWriter;

public class JAXBUtils
{
    /**
     * Unmarshal an XML string
     * @param xml     The XML string
     * @param type    The JAXB class type.
     * @return The unmarshalled object.
     */
    public <T> T unmarshal(String xml, Class<T> type)
    {
        StringReader reader = new StringReader(xml);
        return javax.xml.bind.JAXB.unmarshal(reader, type);
    }

    /**
     * Marshal an Object to XML.
     * @param object    The object to marshal.
     * @return The XML string representation of the object.
     */
    public String marshal(Object object)
    {
        StringWriter stringWriter = new StringWriter();
        JAXB.marshal(object, stringWriter);
        return stringWriter.toString();
    }
}

-1
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

private String generateXml(Object obj, Class objClass) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(objClass);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter sw = new StringWriter();
        jaxbMarshaller.marshal(obj, sw);
        return sw.toString();
    }

-1

অবজেক্টটিকে এক্সএমএল স্ট্রিংয়ে রূপান্তর করতে এই ফাংশনটি ব্যবহার করুন (কনভার্টটক্সএক্সএমএল হিসাবে কল করা উচিত (উত্সবজেক্ট, অবজেক্ট.class);) ->

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;

public static <T> String convertToXml(T source, Class<T> clazz) throws JAXBException {
    String result;
    StringWriter sw = new StringWriter();
    JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    QName qName = new QName(StringUtils.uncapitalize(clazz.getSimpleName()));
    JAXBElement<T> root = new JAXBElement<T>(qName, clazz, source);
    jaxbMarshaller.marshal(root, sw);
    result = sw.toString();
    return result;
}

এক্সএমএল স্ট্রিংটিকে অবজেক্ট ব্যাক -> এ রূপান্তর করতে এই ফাংশনটি ব্যবহার করুন (যেমন বলা উচিত createObjectFromXmlString(xmlString, Object.class))

public static <T> T createObjectFromXmlString(String xml, Class<T> clazz) throws JAXBException, IOException{

    T value = null;
    StringReader reader = new StringReader(xml); 
    JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    JAXBElement<T> rootElement=jaxbUnmarshaller.unmarshal(new StreamSource(reader),clazz);
    value = rootElement.getValue();
    return value;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.