/******************************************************************************* * Copyright (c) 2005, 2014 springside.github.io * * Licensed under the Apache License, Version 2.0 (the "License"); *******************************************************************************/ package org.springside.modules.utils.mapper; import static org.assertj.core.api.Assertions.*; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import org.apache.commons.lang3.builder.ToStringBuilder; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.junit.Test; import org.springside.modules.utils.mapper.XmlMapper; import com.google.common.collect.Lists; /** * 演示基于JAXB2.0的Java对象-XML转换及Dom4j的使用. * * 演示用xml如下: * * <pre> * <?xml version="1.0" encoding="UTF-8"?> * <user id="1"> * <name>calvin</name> * <interests> * <interest>movie</interest> * <interest>sports</interest> * </interests> * </user> * </pre> */ public class XmlMapperTest { @Test public void objectToXml() { User user = new User(); user.setId(1L); user.setName("calvin"); user.getInterests().add("movie"); user.getInterests().add("sports"); String xml = XmlMapper.toXml(user, "UTF-8"); System.out.println("Jaxb Object to Xml result:\n" + xml); assertXmlByDom4j(xml); } @Test public void xmlToObject() { String xml = generateXmlByDom4j(); User user = XmlMapper.fromXml(xml, User.class); System.out.println("Jaxb Xml to Object result:\n" + user); assertThat(user.getId()).isEqualTo(1L); assertThat(user.getInterests()).containsOnly("movie", "sports"); } /** * 测试以List对象作为根节点时的XML输出 */ @Test public void toXmlWithListAsRoot() { User user1 = new User(); user1.setId(1L); user1.setName("calvin"); User user2 = new User(); user2.setId(2L); user2.setName("kate"); List<User> userList = Lists.newArrayList(user1, user2); String xml = XmlMapper.toXml(userList, "userList", User.class, "UTF-8"); System.out.println("Jaxb Object List to Xml result:\n" + xml); } /** * 使用Dom4j生成测试用的XML文档字符串. */ private static String generateXmlByDom4j() { Document document = DocumentHelper.createDocument(); Element root = document.addElement("user").addAttribute("id", "1"); root.addElement("name").setText("calvin"); // List<String> Element interests = root.addElement("interests"); interests.addElement("interest").addText("movie"); interests.addElement("interest").addText("sports"); return document.asXML(); } /** * 使用Dom4j验证Jaxb所生成XML的正确性. */ private static void assertXmlByDom4j(String xml) { Document doc = null; try { doc = DocumentHelper.parseText(xml); } catch (DocumentException e) { fail(e.getMessage()); } Element user = doc.getRootElement(); assertThat(user.attribute("id").getValue()).isEqualTo("1"); Element interests = (Element) doc.selectSingleNode("//interests"); assertThat(interests.elements()).hasSize(2); assertThat(((Element) interests.elements().get(0)).getText()).isEqualTo("movie"); } @XmlRootElement // 指定子节点的顺序 @XmlType(propOrder = { "name", "interests" }) private static class User { private Long id; private String name; private String password; private List<String> interests = Lists.newArrayList(); // 设置转换为xml节点中的属性 @XmlAttribute public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 设置不转换为xml @XmlTransient public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } // 设置对List<String>的映射, xml为<interests><interest>movie</interest></interests> @XmlElementWrapper(name = "interests") @XmlElement(name = "interest") public List<String> getInterests() { return interests; } public void setInterests(List<String> interests) { this.interests = interests; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } } }