package org.springside.examples.showcase.xml;
import static org.junit.Assert.*;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springside.modules.utils.encode.JaxbBinder;
import org.springside.modules.utils.encode.JaxbBinder.CollectionWrapper;
import com.google.common.collect.Lists;
/**
* 演示基于JAXB2.0的Java对象-XML转换及Dom4j的使用.
*
* @author calvin
*
* 演示用xml如下:
*
* <?xml version="1.0" encoding="UTF-8"?>
* <user id="1">
* <name>calvin</name>
* <roles>
* <role id="1" name="admin"/>
* <role id="2" name="user"/>
* </roles>
* <interests>
* <interest>movie</interest>
* <interest>sports</interest>
* </interests>
* <houses>
* <house key="bj">house1</item>
* <hosue key="gz">house2</item>
* </houses>
* </user>
*/
public class JaxbDemo {
private static JaxbBinder binder;
@BeforeClass
public static void setUp() {
binder = new JaxbBinder(User.class, CollectionWrapper.class);
}
@Test
public void objectToXml() {
User user = new User();
user.setId(1L);
user.setName("calvin");
user.getRoles().add(new Role(1L, "admin"));
user.getRoles().add(new Role(2L, "user"));
user.getInterests().add("movie");
user.getInterests().add("sports");
user.getHouses().put("bj", "house1");
user.getHouses().put("gz", "house2");
String xml = binder.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 = binder.fromXml(xml);
System.out.println("Jaxb Xml to Object result:\n" + user);
assertEquals(Long.valueOf(1L), user.getId());
assertEquals(2, user.getRoles().size());
assertEquals("admin", user.getRoles().get(0).getName());
assertEquals(2, user.getInterests().size());
assertEquals("movie", user.getInterests().get(0));
assertEquals(2, user.getHouses().size());
assertEquals("house1", user.getHouses().get("bj"));
}
/**
* 测试以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 = binder.toXml(userList, "userList", "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<Role>
Element roles = root.addElement("roles");
roles.addElement("role").addAttribute("id", "1").addAttribute("name", "admin");
roles.addElement("role").addAttribute("id", "2").addAttribute("name", "user");
//List<String>
Element interests = root.addElement("interests");
interests.addElement("interest").addText("movie");
interests.addElement("interest").addText("sports");
//Map<String,String>
Element houses = root.addElement("houses");
houses.addElement("house").addAttribute("key", "bj").addText("house1");
houses.addElement("house").addAttribute("key", "gz").addText("house2");
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();
assertEquals("1", user.attribute("id").getValue());
Element adminRole = (Element) doc.selectSingleNode("//roles/role[@id=1]");
assertEquals(2, adminRole.getParent().elements().size());
assertEquals("admin", adminRole.attribute("name").getValue());
Element interests = (Element) doc.selectSingleNode("//interests");
assertEquals(2, interests.elements().size());
assertEquals("movie", ((Element) interests.elements().get(0)).getText());
Element house1 = (Element) doc.selectSingleNode("//houses/house[@key='bj']");
assertEquals("house1", house1.getText());
}
}