gpt4 book ai didi

java - Jaxb Complex Marshal 元素

转载 作者:行者123 更新时间:2023-11-29 09:19:45 24 4
gpt4 key购买 nike

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

  1. 为每个嵌套类实现 toString() 方法。 -> 这很好用
  2. 实现编码(marshal)。 -> 这里有错误。

我有这个 XML:

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

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

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

Map - 值是其余属性 - 为此,我实现了具有属性 NAM 和 RTA 的类,类名称是 BBB。

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

我正在从 Unmarshall 方法中调用这个构造器

我现在不知道 map 中值的数量。

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

所以,我为正确执行解码所做的工作是:

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

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

    并实现了 Unmarshall 方法而不是实现 Marshall 方法

这很好用,我得到的数据完全符合我的预期。现在我想实现 Marshal 方法但不确定是否要执行它,因为元素不是常规对象 - 它是一个接口(interface)。

编码(marshal)方法:

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

我现在不知道如何在编码中设置属性。在解码过程中,我需要执行 getAttribute。

我希望我说清楚了。

感谢您的帮助。

鲍里斯。

最佳答案

对于 marshal,您应该能够通过创建包装 BBB 实例的 JAXBElement 来完成您的需要:

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

}

关于java - Jaxb Complex Marshal 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com