有一個nice article,它解釋瞭如何使用XMLAdapter
將自定義XML映射到Java地圖。我會建議你經歷一次。
爲了方便訪問,我將張貼在這裏的有用的代碼:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<profile>
<messages>
<message id="1">
<subject>hi</subject>
<body>wat's up mike.. r u gonna catch us tonight?</body>
</message>
<message id="2">
<subject>re:hi</subject>
<body>My apologies, forgot to tell ya, I'm out of town!!!</body>
</message>
</messages>
</profile>
JAXB註釋消息類:
public class Message {
@XmlAttribute
private String id;
@XmlElement
private String subject;
@XmlElement
private String body;
}
檔案類:
@XmlRootElement(name="profile")
public class Profile {
@XmlElement
@XmlJavaTypeAdapter(MessageAdapter.class)
private HashMap<String, Message> messages;
public Profile(){}
public Profile(HashMap<String, Message> b){
messages = b;
}
}
消息類:
public class Messages {
@XmlElement(name="message")
public Message[] messages;
}
MessageAdaptor:
public class MessageAdapter extends XmlAdapter<Messages,Map<String, Message>> {
@Override
public Map<String, Message> unmarshal(Messages value){
Map<String, Message> map = new HashMap<String, Message>();
for(Message msg : value.messages)
map.put(msg.getId(), msg);
return map;
}
@Override
public Messages marshal(Map<String, Message> map){
Messages msgCont = new Messages();
Collection<Message> msgs = map.values();
msgCont.messages = msgs.toArray(new Message[msgs.size()]);
return msgCont;
}
}
最後的XMLAdaptorTest
public class XmlAdapterTest extends TestCase{
public void testAdapter() throws Exception {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("profile.xml");
if (is != null) {
JAXBContext jc;
try {
//test unmarshaling
jc = JAXBContext.newInstance(Profile.class.getPackage().getName());
Unmarshaller u = jc.createUnmarshaller();
Profile profile = (Profile) u.unmarshal(is);
assertNotNull(profile.getMessages());
assertEquals(2, profile.getMessages().size());
//test marshaling
Marshaller marshaller=jc.createMarshaller();
File xmlDocument = new File("output.xml");
marshaller.marshal(profile, new FileOutputStream(xmlDocument));
assertTrue(xmlDocument.length() > 0);
xmlDocument.delete();
} catch (JAXBException e) {
e.printStackTrace();
fail();
}
}
}
}
你能舉個例子嗎?在我看來,Javadoc解釋瞭如何註釋對象以獲得OP *不需要的XML結構... –
不是我正在尋找的結構。我希望Map中的所有條目都是鍵值對。 – bmauter
Java地圖對象中的條目不受此影響,例如他們仍然實現'java.util.Map.Entry'。 'MyEntry'僅在編組期間使用。或者,你的意思是「不是我正在尋找的結構」的XML輸出?還是你想讓我擴展這個例子來處理更多的類型,而不僅僅是''? –
Tilo