xml和bean间相互转换

前端之家收集整理的这篇文章主要介绍了xml和bean间相互转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近学习了xml和java bean对象间的相互转换,感觉可以和大家分享一下,也希望和大家以后多多交流:

需要引用的包:xstream-1.3.1.jar

主要应用XStream的fromXML()和toXML()方法来实现xml和bean间的相互转换,后面附有源码,下面问题都通过讨论源码展开

碰到的问题1:

Exception in thread "main" java.lang.IllegalArgumentException: XPP3 pull parser library not present. Specify another driver. For example: new XStream(new DomDriver())
at com.thoughtworks.xstream.io.xml.XppDriver.loadLibrary(XppDriver.java:62)
at com.thoughtworks.xstream.io.xml.XppDriver.createReader(XppDriver.java:43)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:845)
at org.evon.example.XmlJava.main(XmlJava.java:22)

解决办法:

XStream对象初始化时,调用构造方法XStream(HierarchicalStreamDriver hierarchicalStreamDriver),具体用法如下:

XStream xStream = new XStream(new DomDriver());

碰到的问题2:

xml节点名称出现包名,具体内容如下

<org.evon.example.User>
<uid>8888</uid>
<uname>evon</uname>
<type>
<id>type</id>
<org.evon.example.Point>
<x>100</x>
<y>100</y>
</org.evon.example.Point>
<org.evon.example.Point>
<x>200</x>
<y>200</y>
</org.evon.example.Point>
</type>
<point>
<x>0</x>
<y>0</y>
</point>
</org.evon.example.User>
</org.evon.example.User>

解决办法:

调用XStream对象的alias方法,具体使用方法如下:

xStream.alias("user",User.class);
xStream.alias("type",Type.class);
xStream.alias("point",Point.class);

碰到的问题3:同一标签下多个同名元素的显示

解决办法:

方法1:调用addImplicitCollection方法,具体使用如下

xStream.addImplicitCollection(Type.class,"pointList");

方法2:使用注解,需要进行两步操作,具体使用如下

1)Type类pointList属性声明前加上注解@XStreamImplicit(itemFieldName="point")

@XStreamImplicit(itemFieldName="point")
private List<Point> pointList;

2)解析前开启注解解析

xStream.autodetectAnnotations(true);


源码如下:

package org.evon.example;

import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XmlJava {
    public static void main(String[] args) { 
        User user = createUser();
        XStream xStream = new XStream(new DomDriver());
        xStream.addImplicitCollection(Type.class,"pointList");
//        xStream.autodetectAnnotations(true);
        xStream.alias("user",User.class);
        xStream.alias("type",Type.class);
        xStream.alias("point",Point.class);
        String xml = xStream.toXML(user);
        System.out.println("bean转换成的xml:");
        System.out.println(xml);
        
        User newUser = (User)xStream.fromXML(xml); 
        System.out.println("xml转换成的bean,bean重新转换成的xml:");
        System.out.println(xStream.toXML(newUser));
    }
    private static User createUser(){
        Type type = new Type();
        type.setId("type");       
        List<Point> pointList = new ArrayList<Point>();
        Point point1 = new Point();
        point1.setX(100);
        point1.setY(100);
        Point point2 = new Point();
        point2.setX(200);
        point2.setY(200);
        pointList.add(point1);
        pointList.add(point2);
        type.setPointList(pointList);
        
        Point point = new Point();
        point.setX(0);
        point.setY(0);
        
        User user = new User();
        user.setUid(8888);
        user.setUname("evon");
        user.setType(type);
        user.setPoint(point);
        return user;
    }
}

class User {
	private int uid;
	private String uname;
	private Type type;
	private Point point;
	
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public Type getType() {
		return type;
	}
	public void setType(Type type) {
		this.type = type;
	}
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	}
}

class Type{
	private String id;
//	@XStreamImplicit(itemFieldName="point")
	private List<Point> pointList;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public List<Point> getPointList() {
		return pointList;
	}
	public void setPointList(List<Point> pointList) {
		this.pointList = pointList;
	}
}

class Point{
	private int x;
	private int y;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
}


由于本人所学有限,有的地方论述不尽详细;若有问题,欢迎大家指正,QQ:823746747

猜你在找的XML相关文章