Jaxb Complex Marshal元素

时间:2011-08-28 08:41:32

标签: java jaxb marshalling element

我有一个复杂的XML,我需要从中构建java对象。 我是用Unmarshal做的。 虽然这项工作很完美,但我还需要将Java对象打印为String。 我有两个解决方案:

  1. 为每个嵌套类实现toString()方法。 - >这很好用
  2. 实施元帅。 - >这里有错误。
  3. 我有这个XML:

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

    我需要生成java对象的地图表示。

    Map - Key是此示例中的第一个属性a1,a2,a3 ...

    Map - value是其余的属性 - 对于这个i实现的类,它具有NAM和RTA属性,类名是BBB。

    在这个类中,我构建了一个具有1个参数的构造函数 - Element。

    我是用Unmarshall方法打电话给这个construtor

    我现在不知道地图中的数值。

    我现在不知道属性的名称 - a1,a2 ..需要是通用的

    所以,我正确做的解决方法是:

    1. 我构建了一个包含Elememt列表的类(org.w3c.dom.Element)      - 使用@XmlAnyElement注释。 班级名称是ABC

    2. 我构建了一个扩展了       XmlAdapter {ABC,MAP {String,BBB}}

      并实现了Unmarshall方法,而没有实现Marshall方法

    3. 这很好用,我得到的数据完全符合我的预期。 现在我想实现Marshal方法并且不确定要这样做因为element不是常规对象 - 它是一个接口。

      元帅方法:

      @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;
      }
      

      我现在不知道如何在马歇尔中设置属性。 在unmarshal我需要做getAttribute。

      我希望我很清楚。

      感谢您的帮助。

      鲍里斯。

1 个答案:

答案 0 :(得分:0)

对于元帅,你应该能够通过创建包装BBB实例的JAXBElements来完成你需要的东西:

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;
    }

}