java - जेएमएएबी मार्शल एक्सएमएडएपी द्वारा बनाई गई एक अर्रे लिस्ट



arraylist jaxb (1)

अपने XmlAdapter आपको XmlAdapter किसी XmlAdapter बजाय सीधे List संपत्ति के साथ ऑब्जेक्ट के एक उदाहरण में कनवर्ट करना होगा।

HashMapAdapter

package forum13163430;

import java.util.*;
import java.util.Map.Entry;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public final class HashMapAdapter extends XmlAdapter<HashMapAdapter.AdaptedHashMap, HashMap<String, String>> {

    @Override
    public AdaptedHashMap marshal(HashMap<String, String> hashMap) throws Exception {
        AdaptedHashMap adaptedHashMap = new AdaptedHashMap();
        for(Entry<String, String> entry : hashMap.entrySet()) {
            adaptedHashMap.item.add(new HashMapEntry(entry.getKey(), entry.getValue()));
        }
        return adaptedHashMap;
    }

    @Override
    public HashMap<String, String> unmarshal(AdaptedHashMap adaptedHashMap) throws Exception {
        HashMap<String, String> result = new HashMap<String, String>();
        for(HashMapEntry entry : adaptedHashMap.item)
            result.put(entry.key, entry.value);
        return result;
    }

    public static class AdaptedHashMap {
        public List<HashMapEntry> item = new ArrayList<HashMapEntry>();
    }

    public static class HashMapEntry {

        @XmlAttribute 
        public String key;

        @XmlValue
        public String value;

        public HashMapEntry() {
        }

        public HashMapEntry(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }

}

अधिक जानकारी के लिए

अद्यतन करें

धन्यवाद, यह काम करता है हालांकि, मुझे उत्पादित XML में एनोटेशन का एक अतिरिक्त स्तर मिलता है क्या इससे बचने का कोई तरीका है?

यदि आप ईक्लिपसेलिंक एमओएक्सी को अपने जेएसीएबी (जेएसआर -222) प्रदाता के रूप में उपयोग कर रहे हैं तो आप इस उपयोग केस के लिए @XmlPath विस्तार का लाभ उठा सकते हैं। मैं एक उदाहरण के साथ नीचे प्रदर्शित करेंगे

फू

@XmlJavaTypeAdapter पर अतिरिक्त हैशप संपत्ति पर मैंने मैक्सि के @XmlPath एनोटेशन को जोड़ा है। "." का एक XML पथ इंगित करता है कि बच्चे को माता-पिता XML तत्व में संगमरमर होना चाहिए।

package forum13163430;

import java.util.HashMap;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
public class Foo {

    private HashMap<String, String> hashMap;

    public Foo() {
        this.hashMap = new HashMap<String, String>();
    }

    @XmlPath(".")
    @XmlJavaTypeAdapter(HashMapAdapter.class)
    public HashMap<String, String> getHashmap() {
        return hashMap;
    }

    public void setHashmap(HashMap<String, String> hashMap) {
        this.hashMap = hashMap;
    }

}

jaxb.properties

अपने JAXB प्रदाता के रूप में एमओसी को निर्दिष्ट करने के लिए आपको अपने डोमेन मॉडल के रूप में एक ही पैकेज में jaxb.properties नामक फाइल को शामिल करने की आवश्यकता है (देखें: http://blog.bdoughan.com/2011/05/specifying-eclipselink- moxy-as-your.html )

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

डेमो

चूंकि MOXy JAXB (JSR-222) आज्ञाकारी कार्यान्वयन है, इसलिए मानक API को / से एक्सएमएल ऑब्जेक्ट कन्वर्ट करने के लिए इस्तेमाल किया जा सकता है।

package forum13163430;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13163430/input.xml");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

input.xml / आउटपुट

नीचे डेमो कोड चलाने से इनपुट और आउटपुट हैं

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <item key="b">B</item>
   <item key="c">C</item>
   <item key="a">A</item>
</foo>

अधिक जानकारी के लिए

मैं XmlAdapter का उपयोग कर एक XmlAdapter फ़ील्ड के XML प्रस्तुति को अनुकूलित करना चाहता हूं मैं ऐसा करने के लिए एक ArrayList का उपयोग करता हूँ हालांकि, जब ArrayList marshalling बिल्कुल marshalled नहीं है। ऐसा क्यों है?

कोड

@XmlRootElement
public class Foo {

    private HashMap<String, String> hashMap;

    public Foo() {
        this.hashMap = new HashMap<String, String>();
    }

    @XmlJavaTypeAdapter(HashMapAdapter.class)
    public HashMap<String, String> getHashmap() {
        return hashMap;
    }

    public void setHashmap(HashMap<String, String> hashMap) {
        this.hashMap = hashMap;
    }

}
public final class HashMapAdapter extends XmlAdapter<ArrayList<HashMapEntry>, HashMap<String, String>> {

    @Override
    public ArrayList<HashMapEntry> marshal(HashMap<String, String> arg0) throws Exception {
        ArrayList<HashMapEntry> result = new ArrayList<HashMapEntry>();
        for(Entry<String, String> entry : arg0.entrySet())
            result.add(new HashMapEntry(entry.getKey(), entry.getValue()));
        return result;
    }

    @Override
    public HashMap<String, String> unmarshal(ArrayList<HashMapEntry> arg0) throws Exception {
        HashMap<String, String> result = new HashMap<String, String>();
        for(HashMapEntry entry : arg0)
            result.put(entry.key, entry.value);
        return result;
    }

}
public class HashMapEntry {

    @XmlElement 
    public String key;

    @XmlValue
    public String value;

    public HashMapEntry() {

    }

    public HashMapEntry(String key, String value) {
        this.key = key;
        this.value = value;
    }
}

परिणाम

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo><hashmap/></foo>




xmladapter