有一个名为Parent
的类,它从xsd文件生成并保存一个完整的JABX注释List.
此类无法更改。此外,还有一个Child extends Parent
类希望使用XmlAdapter
将List
转换为HashMap
。 HashMap
字段将具有(可能)相同的名称并映射到相同的xsd元素。
JAXB可以多次设置一个具有相同名称的字段吗? JAXB是否尝试使用父类的已填充List
作为子类中XmlAdapter
的输入?我认为这不会像我希望的那样有效。
如何巧妙地完成这项任务?
编辑:我真正的问题是如何使用不应编辑的JAXB自动生成的bean,并且仍然可以使用hashmap。
这是我的代码不起作用。地图保持为空。为了糟糕的代码格式而烦恼。
public class Adapter extends XmlAdapter<LinkedList<A>,HashMap<String,A>> {
@Override
public LinkedList<A> marshal(HashMap<String, A> v) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public HashMap<String, A> unmarshal(LinkedList<A> v) throws Exception {
HashMap<String, A> map = new HashMap<String, A>();
for(A a:v) {
map.put(a.k, a);
}
return map;
}
}
@XmlRootElement
public class Child extends Parent {
@XmlElement(name="a")
@XmlJavaTypeAdapter(Adapter.class)
HashMap<String,A> map;
}
@XmlRootElement
public class Parent {
@XmlElement(name="a")
LinkedList<A> values = new LinkedList<A>();
}
public class XmlTest {
public static void main(String[] args) throws ParserConfigurationException, JAXBException, SAXException, IOException {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(new File("test.xml"));
JAXBContext jc = JAXBContext.newInstance(Child.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Child instance = unmarshaller.unmarshal(doc,Child.class).getValue();
}
}
这是A类:
public class A {
@XmlAttribute
String v;
@XmlAttribute
String k;
}
此处为test.xml
:
<root>
<a v="1" k="a"/>
<a v="2" k="b"/>
</root>
答案 0 :(得分:1)
通过Blaise Doughan查看示例。在您的情况下,class A
为class MyMapEntryType
,class Parent
为class MyMapType
。 class Child
不应扩展Parent
,因为它只是JAXB能够映射<a>
元素列表的中间类。