XStream的简单使用

XStream既可以把对象转换为XML,也可以把XML转换为对象。下面的代码是他的一些简单使用。

    @Test
    public void test01() {
        //1、创建XStream对象
        XStream stream = new XStream();
        //默认的名称使用的是包的名称可以通过alias改别名
        stream.alias("person", Person.class);
        //改属性名也是可以的,一般不用
        stream.aliasField("username",Person.class, "name");
        //如果希望把某个子节点修改为属性也可以,但是更不常用
        stream.useAttributeFor(Person.class, "id");
        //2、创建对象
        Person p = new Person(1,"小武",1900,24);
        //3、完成转换
        String xml = stream.toXML(p);
        //4、输出
        System.out.println(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,"财务处"));
        System.out.println(stream.toXML(u));

    }

    //转换一组对象
    @Test
    public void test03() {
        XStream stream = new XStream();
        stream.alias("user", User.class);
        //设置别名users
        stream.alias("users",List.class);
        List<User> us = new ArrayList<User>();
        User u = new User(1,"劳动法","123",new Group(1,"财务处"));
        us.add(u);
        us.add(new User(2,"张学友","123",new Group(1,"财务处")));
        us.add(new User(3,"黎明","123",new Group(1,"财务处")));
        us.add(new User(4,"郭富城","123",new Group(1,"物理系")));
        System.out.println(stream.toXML(us));

    }

    //隐藏某个节点
    @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"));
        System.out.println(stream.toXML(g));
    }

    //将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转换为对象列表
    @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());
        }
    }

    //转化为jason
    @Test
    public void test07() {
        //转换json需要使用Jettison这个包
        XStream stream = new XStream(new JettisonMappedXmlDriver(){
            //通过覆盖以下方法可以有效的删除json根节点
            //一般不使用XStream来转换json,效率不高,效率比较高的Json工具是Jaskson
            @Override
            public HierarchicalStreamWriter createWriter(Writer out) {
                 return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
            }
        });
        stream.alias("group",Group.class);
        stream.alias("user", User.class);
        Group g = new Group();
        g.addUser(new User(1,"老张","123"));
        g.addUser(new User(2,"老李","1234"));
        g.addUser(new User(3,"老刘","12345"));
        g.addUser(new User(4,"老王","123456"));
        System.out.println(stream.toXML(g));
    }

上述代码用到的对象

public class User {
    private int id;
    private String username;
    private String password;
    private Group group;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Group getGroup() {
        return group;
    }
    public void setGroup(Group group) {
        this.group = group;
    }

    public User() {
    }

    public User(int id, String username, String password, Group group) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.group = group;
    }

    public User(int id, String username, String password) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
    }
}

public class Group {
    private int id;
    private String name;
    List<User> users;

    public void addUser(User u) {
        if(users==null) {
            users = new ArrayList<User>();
        }
        users.add(u);
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Group(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Group() {
    }

}

test06使用到的xml

<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user>
    <id>1</id>
    <username>劳动法</username>
    <password>123</password>
    <group>
      <id>1</id>
      <name>财务处</name>
    </group>
  </user>
  <user>
    <id>2</id>
    <username>张学友</username>
    <password>123</password>
    <group>
      <id>1</id>
      <name>财务处</name>
    </group>
  </user>
  <user>
    <id>3</id>
    <username>黎明</username>
    <password>123</password>
    <group>
      <id>1</id>
      <name>财务处</name>
    </group>
  </user>
  <user>
    <id>4</id>
    <username>郭富城</username>
    <password>123</password>
    <group>
      <id>1</id>
      <name>物理系</name>
    </group>
  </user>
</users>

根据上述代码,我们可以做一个XStreamUtil来帮助我们更方便的使用他。

    public class XStreamUtil {
    private static XStreamUtil util;
    private XStreamUtil(){}

    public static XStreamUtil getInstacne() {
        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);
    }
}

你可能感兴趣的:(java,xml,xstream)