我有一个复杂的XML,我需要从中构建java对象。 我是用Unmarshal做的。 虽然这项工作很完美,但我还需要将Java对象打印为String。 我有两个解决方案:
我有这个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 ..需要是通用的
所以,我正确做的解决方法是:
我构建了一个包含Elememt列表的类(org.w3c.dom.Element) - 使用@XmlAnyElement注释。 班级名称是ABC
我构建了一个扩展了 XmlAdapter {ABC,MAP {String,BBB}}
并实现了Unmarshall方法,而没有实现Marshall方法
这很好用,我得到的数据完全符合我的预期。 现在我想实现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。
我希望我很清楚。
感谢您的帮助。
鲍里斯。
答案 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;
}
}