Jaxb Комплекс Маршал элемент - PullRequest
2 голосов
/ 28 августа 2011

У меня есть сложный XML, из которого мне нужно создавать объекты Java.Я делаю это с помощью Unmarshal.в то время как эта работа прекрасно, мне также нужно напечатать объект Java как String.У меня есть два решения для этого:

  1. реализовать метод toString () для каждого из вложенных классов.-> это прекрасно работает
  2. маршал.-> здесь есть ошибки.

У меня есть этот XML:

<Lang>
        <a1 NAM="Momo" RTA="" />
        <a2 NAM="Rena" RTA="buba" />
        <a3 NAM="Fiba" RTA="kusit" />
        <a4 NAM="Shila" RTA="hamuda" />
<Lang>  

Мне нужно было сгенерировать представление карты объекта Java.

Карта - ключпервый атрибут в этом примере a1, a2, a3 ...

Map - значением являются остальные атрибуты - для этого реализованного мной класса, имеющего атрибут NAM и RTA, имя класса BBB.

В этом классе я создаю конструктор, который имеет 1 параметр - Элемент.

Я вызываю этого конструктора из метода Unmarshall

У меня нет значений значений вmap.

у меня сейчас нет имени атрибута - a1, a2 .. должны быть универсальными

Итак, что я сделал, чтобы правильно выполнить демаршалл это:

  1. Я создаю класс, содержащий список элементов (org.w3c.dom.Element) - с аннотацией @XmlAnyElement.имя класса ABC

  2. Я создаю класс, который расширяет XmlAdapter {ABC, MAP {String, BBB}}

    и реализует метод Unmarshall, а НЕ реализует в Marshallmethod

Это отлично работает, я получаю данные именно так, как я и ожидал.Теперь я хочу реализовать метод Маршала и не уверен, что собираюсь это делать, потому что элемент не является обычным объектом - это интерфейс.

Метод Маршала:

@Override
public LangVos marshal(Map<String, BBB> map) {
    ABC abc = new ABC();
    langVos.langVOs = new ArrayList<Element>(map.size());
    for (Entry<String, BBB> entry : map.entrySet()) {

        Element e = (Element) entry.getValue(); // how to create Element using factory from entry ?
        ABC.list.add(e); 
    }
    return abc;
}

Iне сейчас, как установить атрибуты в маршале.Находясь в демаршале, мне нужно было сделать getAttribute.

Надеюсь, я проясню.

Спасибо за любую помощь.

Борис.

1 Ответ

0 голосов
/ 29 августа 2011

Для маршала вы должны быть в состоянии выполнить то, что вам нужно, создав JAXBElements, которые обертывают экземпляры BBB:

package forum7219883;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.namespace.QName;

import org.w3c.dom.Element;

public class MapAdapter extends XmlAdapter<AdaptedMap, Map<String, BBB>>{

    @Override
    public AdaptedMap marshal(Map<String, BBB> map) throws Exception {
        AdaptedMap adaptedMap = new AdaptedMap();
        for(Entry<String, BBB> entry : map.entrySet()) {
            adaptedMap.entry.add(new JAXBElement<BBB>(new QName(entry.getKey()), BBB.class, entry.getValue()));
        }
        return adaptedMap;
    }

    @Override
    public Map<String, BBB> unmarshal(AdaptedMap arg0) throws Exception {
        int entrySize = arg0.entry.size();
        Map<String, BBB> map = new HashMap<String, BBB>(entrySize);
        for(int x=0; x<entrySize; x++) {
            Element element = (Element) arg0.entry.get(x);
            BBB bbb = new BBB();
            bbb.setNam(element.getAttribute("NAM"));
            bbb.setRta(element.getAttribute("RTA"));
            map.put(element.getLocalName(), bbb);
        }
        return map;
    }

}
...