xml与对象之间的转换

需要导入XStream的包

public class TestXstream {

    /**单个对象转换为xml测试*/
    @Test
    public void test01() {
        //1.创建XStream对象
        XStream stream=new XStream();
        //默认的名称使用的是包的名称,可以通过alias改别名
        stream.alias("person",Person.class);
        //改属性名也是可以的,但是一般不用
        stream.aliasField("pname",Person.class,"name");
        //如果希望把某个子节点修改为xml中的属性也可以,但是更不常用
        stream.useAttributeFor(Person.class,"id");
        //2.创建对象
        Person p=new Person(1,"小武",1900,24);
        //3.完成转换
        String xml=stream.toXML(p);
        System.out.println(xml);
    }
    
    /**单个关联对象转换为xml测试*/
    @Test
    public void test02() {
        XStream stream=new XStream();
        stream.alias("user",User.class);
        stream.alias("group",Group.class);
        User u=new User(1,"劳动法","123",new Group(1,"财务处"));
        String xml=stream.toXML(u);
        System.out.println(xml);
    }

    /**List对象转换为xml测试*/
    @Test
    public void test03() {
        XStream stream=new XStream();
        stream.alias("user",User.class);
        stream.alias("users",List.class);
        List<User> us=new ArrayList<User>();
        us.add(new User(1,"劳动法","123",new Group(1,"财务处")));
        us.add(new User(1,"张学友","123",new Group(1,"财务处")));
        us.add(new User(1,"黎明","123",new Group(1,"财务处")));
        us.add(new User(1,"郭富城","123",new Group(1,"物理系")));
        String xml=stream.toXML(us);
        System.out.println(xml);
    }
    
    /**属性List对象转换为xml测试*/
    @Test
    public void test04() {
        XStream stream=new XStream();
        stream.alias("user",User.class);
        stream.alias("group",Group.class);
        Group g=new Group();
        /*默认情况在users这个节点中会封装一个users的父节点,然后才封装user
         * 有些时候可能不需要users节点*/
        stream.addImplicitCollection(Group.class,"users");
        g.addUser(new User(1,"老张","123"));
        g.addUser(new User(2,"老李","1234"));
        g.addUser(new User(3,"老刘","12345"));
        g.addUser(new User(4,"老玉","123456"));
        String xml=stream.toXML(g);
        System.out.println(xml);
    }
    
    /**xml转换为对象测试*/
    @Test
    public void test05() {
        XStream stream=new XStream();
        stream.alias("user",User.class);
        String xml="<user><id>1</id><username>aaa</username><password>123</password>"
                + "<group><id>1</id><name>财务处</name></group></user>";
        User user=(User)stream.fromXML(xml);
        System.out.println(user.getId()+","+user.getUsername()+","+user.getPassword()+","
                +user.getGroup().getName());
    }
    
    /**xml转换为List对象测试*/
    @Test
    public void test06() {
        XStream stream=new XStream();
        stream.alias("user",User.class);
        stream.alias("users",List.class);
        List<User> us=(List<User>)stream
        .fromXML(
                TestXstream.class
                .getClassLoader()
                .getResourceAsStream("users.xml"));
        for(User user:us){
            System.out.println(user.getId()+","+user.getUsername()+","+user.getPassword()+","
                +user.getGroup().getName());
        }
    }
    
    /**对象转换为json对象测试,转换json需要使用Jettison.jar*/
    @Test
    public void test07() {
        XStream stream=new XStream(new JettisonMappedXmlDriver(){
            /*通过覆盖以下方法可以有效删除json根节点,
             * 一般不适用XStream来转换json,效率不高
             * 效率比较高的是Jackson*/
            @Override
            public HierarchicalStreamWriter createWriter(Writer out) {
                return new JsonWriter(out,JsonWriter.DROP_ROOT_MODE);
            }
        });
        stream.alias("user",User.class);
        stream.alias("group",Group.class);
        Group g=new Group();
        stream.addImplicitCollection(Group.class,"users");
        g.addUser(new User(1,"老张","123"));
        g.addUser(new User(2,"老李","1234"));
        g.addUser(new User(3,"老刘","12345"));
        g.addUser(new User(4,"老玉","123456"));
        String xml=stream.toXML(g);
        System.out.println(xml);
    }
}
///////////////////////////////////////////////
工具库封装
public class XStreamUtil {
    private static XStreamUtil util;
    private XStreamUtil(){}
    
    public static XStreamUtil getInstance(){
        if(util==null) util=new XStreamUtil();
        return util;
    }
    
    public String obj2xml(Object obj,Map<String,Class<?>> alias){
        XStream stream=new XStream();
        Set<String> keys=alias.keySet();
        for(String key:keys){
            stream.alias(key,alias.get(key));
        }
        return stream.toXML(obj);
    }
    
    public Object xml2obj(String xml,Map<String,Class<?>> alias){
        XStream stream=new XStream();
        Set<String> keys=alias.keySet();
        for(String key:keys){
            stream.alias(key,alias.get(key));
        }
        return stream.fromXML(xml);
    }
}

服务端发送xml
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.由于返回的是XML对象,需要为response设置contentType
        response.setContentType("text/xml;charset=utf-8");
        //2.获取Writer
        Writer out=response.getWriter();
        //3.获取部门id
        int did=Integer.parseInt(request.getParameter("did"));
        //4.获取用户列表对象
        List<Person> ps=persons.get(did);
        //5.拼接XML
        /*StringBuffer px=new StringBuffer();
        px.append("<persons>");
        for(Person p:ps){
            px.append("<person>");
            px.append("<id>").append(p.getId()).append("</id>");
            px.append("<name>").append(p.getName()).append("</name>");
            px.append("<salary>").append(p.getSalary()).append("</salary>");
            px.append("<age>").append(p.getAge()).append("</age>");
            px.append("</person>");
        }
        px.append("</persons>");*/
        Map<String,Class<?>> alias=new HashMap<String,Class<?>>();
        alias.put("persons",List.class);
        alias.put("person",Person.class);
        String xml=XStreamUtil.getInstance().obj2xml(ps, alias);
        //6.通过out写回去
        //out.write(px.toString());
        out.write(xml);
    }


你可能感兴趣的:(xml与对象之间的转换)