এক্সএমএল স্ট্রিং থেকে অবজেক্ট তৈরি করতে JAXB ব্যবহার করুন


174

আমি কীভাবে কোনও এক্সএমএল স্ট্রিংয়ের মানচিত্রটিকে নিচের জ্যাক্সবি অবজেক্টে নিবিড় করে তুলতে নীচের কোডটি ব্যবহার করতে পারি?

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal("xml string here");

@XmlRootElement(name = "Person")
public class Person {
    @XmlElement(name = "First-Name")
    String firstName;
    @XmlElement(name = "Last-Name")
    String lastName;
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

উত্তর:


282

এক্সএমএল বিষয়বস্তু পাস করার জন্য আপনাকে এটিকে সামগ্রীতে মোড়ানো দরকার Readerএবং তার পরিবর্তে আনমর্শাল করা উচিত:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

StringReader reader = new StringReader("xml string here");
Person person = (Person) unmarshaller.unmarshal(reader);

6
"এক্সএমএল স্ট্রিং এখানে" যদি একটি এসওএপি খাম অন্তর্ভুক্ত করে তবে আপনি কি এই উত্তরটি অন্তর্ভুক্ত করতে পারবেন?
জুইলে

আপনি যদি Readerকোনও নির্দিষ্ট শিমের বর্গের সাথে সংমিশ্রণটি ব্যবহার করতে চান ? যেহেতু কোনও unmarshall(Reader, Class)পদ্ধতি নেই। যেমন একটি উপায় আছে রূপান্তর হয় Readerএকটি থেকে javax.xml.transform.Source?
বিভিডিবি

2
আমার ক্ষেত্রে এই হিসাবে কাজ করুন:JAXBElement<MyObject> elemento = (JAXBElement<MyObject>)unmarshaller.unmarshal(reader); MyObject object = elemento.getValue();
সিজার মিগুয়েল

1
@bvdb আপনি ব্যবহার করতে পারেন javax.xml.transform.stream.StreamSourceযা কনস্ট্রাকটর যে নিতে হয়েছে Reader, Fileঅথবা InputStream
মুহাদ

ধন্যবাদ! আমার ক্ষেত্রে আমার কিছুটা আলাদা করা দরকার: ব্যক্তি ব্যক্তি = (ব্যক্তি) ((জ্যাকএক্সবিলেট) আনমারশালার.উনমারশাল (পাঠক)) গেটভ্যালু ();
গুস্তাভো আমারো

161

অথবা আপনি যদি একটি সাধারণ ওয়ানলাইনার চান:

Person person = JAXB.unmarshal(new StringReader("<?xml ..."), Person.class);

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি কিছুটা কম জটিল।
bobbel

খুব সহজ. আমি পুরোপুরি একমত, এটি অবশ্যই গ্রহণযোগ্য উত্তর হতে হবে।
আফারিয়া

5
আমি উপরের মন্তব্যে আসলেই দ্বিমত পোষণ করছি। এটি অবশ্যই সহজ তবে এটি ফ্লাইতে প্রসঙ্গ তৈরি করে যাতে প্রসঙ্গটি ক্যাশে না হওয়া পর্যন্ত এটির পারফরম্যান্সের প্রভাব পড়তে পারে। সতর্কতার সাথে ব্যবহার করুন.
ক্রিস্টার্ক

সুতরাং আমরা যদি unmarshaller একটি ক্লাস সরবরাহ করতে চান বিকল্প কি? একমাত্র পদ্ধতিটি প্যারামিটারে একটি (নোড, শ্রেণি) নেবে এবং এখানে আমাদের কাছে স্ট্রিং রয়েছে।
চার্লস ফললেট

এই সংক্ষিপ্ত সংস্করণটি সহ আমি পার্সিং ত্রুটিগুলি গ্রহণ করি না, এটি একটি কনফিগারেশন ডিবাগ করার জন্য দরকারী। সম্ভবত আমি কিছু মিস করছি ...
বিভার

21

কোন unmarshal(String)পদ্ধতি নেই। আপনার একটি ব্যবহার করা উচিত Reader:

Person person = (Person) unmarshaller.unmarshal(new StringReader("xml string"));

তবে সাধারণত আপনি যে স্ট্রিংটি কোথাও থেকে পাচ্ছেন, উদাহরণস্বরূপ একটি ফাইল। যদি সেই ক্ষেত্রে, ভাল পাস FileReaderনিজেই।


3

আপনার যদি ইতিমধ্যে এক্সএমএল থাকে এবং একাধিক বৈশিষ্ট্য আসে তবে আপনি এটি নীচের মত পরিচালনা করতে পারেন:

String output = "<ciudads><ciudad><idCiudad>1</idCiudad>
<nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad>
<nomCiudad>Pereira</nomCiudad></ciudads>";
DocumentBuilder db = DocumentBuilderFactory.newInstance()
    .newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(output));

Document doc = db.parse(is);
NodeList nodes = ((org.w3c.dom.Document) doc)
    .getElementsByTagName("ciudad");

for (int i = 0; i < nodes.getLength(); i++) {           
    Ciudad ciudad = new Ciudad();
    Element element = (Element) nodes.item(i);

    NodeList name = element.getElementsByTagName("idCiudad");
    Element element2 = (Element) name.item(0);
    ciudad.setIdCiudad(Integer
        .valueOf(getCharacterDataFromElement(element2)));

    NodeList title = element.getElementsByTagName("nomCiudad");
    element2 = (Element) title.item(0);
    ciudad.setNombre(getCharacterDataFromElement(element2));

    ciudades.getPartnerAccount().add(ciudad);
}
}

for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
System.out.println(ciudad1.getIdCiudad());
System.out.println(ciudad1.getNombre());
}

পদ্ধতিটি চ্যারেটারডেটাফ্রোমুলেশন

public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;

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