Java学习--xml文本转换成Java对象

最近在做项目中用到XML,期间遇到了很多的问题,个人总结一下,欢迎指正。

XML文本以及标注。

<person>    【《一级标签》 对应PersonBean类,而且PersonBean类用@XStreamAlias("person")修饰。】
<firstName>chen</firstName>	【《没有子标签,直接在PersonBean类中定义》】
<lastName>youlong</lastName>
<telphone>	【《二级标签(内部的元素不是以列表的形式存在)》 对应PhoneNumber数据类,在定义telphone这个字段的时有两种方法分别是(private PhoneNumber telphone;(此变量的命名一定和xml中字段名相同)或者@XStreamAlias("telphone") private PhoneNumber tel;(用注解的方法标注字段名,变量名就可以随意了))】
    <code>137280</code>
    <number>137280968</number>
</telphone>
<faxphone>
    <code>20</code>
    <number>020221327</number>
</faxphone>
<friends>	【《三级标签(内部中的元素以列表的形式存在)》 对应Friends类。在Friends类中需要声明一个列表,并使用@XStreamImplicit(itemFieldName="name")注解标注标签中重复的元素 】
    <name>A1</name>
    <name>A2</name>
    <name>A3</name>
</friends>
<pets>	【《三级标签(含有四级标签,并且四级标签中的元素是以列表的形式存在)》 对应Pets类,并且在Pets类中以列表的形式声明出Pet标签(@XStreamImplicit(itemFieldName="pet")(此注解声明‘pet’标签)private List<Pet> petList;)Pet类含有pet标签下的元素 】
    <pet>
        <name>doly</name>
        <age>2</age>
    </pet>
    <pet>
        <name>Ketty</name>
        <age>2</age>
    </pet>"+
</pets>
</person>

具体代码:

PersonBean类,主要声明《person》一级标签下的元素

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("person")
public class PersonBean {
	
	
    private String firstName;
    private String lastName;
    private PhoneNumber telphone;
    private PhoneNumber faxphone;
 //   @XStreamAlias("friends")
    private Friends friends;
 //   @XStreamAlias("pets")
    private Pets pets;		//

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public PhoneNumber getTel() {
		return telphone;
	}

	public void setTel(PhoneNumber tel) {
		this.telphone = tel;
	}

	public PhoneNumber getFax() {
		return faxphone;
	}

	public void setFax(PhoneNumber fax) {
		this.faxphone = fax;
	}

	public Friends getFriend() {
		return friends;
	}

	public void setFriend(Friends friend) {
		this.friends = friend;
	}

	public Pets getPet() {
		return pets;
	}

	public void setPet(Pets pet) {
		this.pets = pet;
	}
}

Pets类,声明二级标签pets下的元素

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class Pets {

	@XStreamImplicit(itemFieldName="pet")
    private List<Pet> petList;
     
    public List<Pet> getAnimalList() {
        return petList;
    }

    public void setAnimalList(List<Pet> animalList) {
        this.petList = animalList;
    }
}

pet类,声明三级标签下pet中的元素util.List;

public class Pet {
	
    private String name;
    private int age;
    
//    public Pet() {
//    	
//    }
    
//    public Pet(String name,int age){
//        this.name=name;
//        this.age=age;
//    }
    
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
}

Friends类,声明friend二级标签中的元素,friends标签下的元素是以列表的形式存在的

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class Friends {

    @XStreamImplicit(itemFieldName="name")
    private List<String> name;
	 
     public List<String> getName() {
         return name;
     }

     public void setName(List<String> name) {
         this.name = name;
     }
}

PhoneNumber 类是声明telphone和faxphone下的元素。

public class PhoneNumber {

    private int code;
    private String number;
    public int getCode() {
	return code;
    }
	
    public void setCode(int code) {
	this.code = code;
    }
	
    public String getNumber() {
	return number;
    }
	
    public void setNumber(String number) {
	this.number = number;
    }
}

XmlUtil 类是具体的操作类

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XmlUtil {

	 /**
     * java 转换成xml
     * @Title: toXml 
     * @Description: TODO 
     * @param obj 对象实例
     * @return String xml字符串
     */
	 public static String toXml(Object obj) {
         XStream xstream=new XStream();
//       XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释
//       XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释
          
         ////如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
         xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话
         return xstream.toXML(obj);
     }
	 
	 /**
      *  将传入xml文本转换成Java对象
      * @Title: toBean 
      * @Description: TODO 
      * @param xmlStr
      * @param cls  xml对应的class类
      * @return T   xml对应的class类的实例对象
      * 
      * 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
      */
	 @SuppressWarnings("unchecked")
     public static <T> T  toBean(String xmlStr,Class<T> cls){
         //注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
         XStream xstream=new XStream(new DomDriver());
         xstream.processAnnotations(cls);
         T obj=(T)xstream.fromXML(xmlStr);
         return obj;         
     }
     public static void main(String[] args) {
		 String xmlStr="<person>"+
	             "<firstName>chen</firstName>"+
	             "<lastName>youlong</lastName>"+
	             "<telphone>"+
	               "<code>137280</code>"+
	               "<number>137280968</number>"+
	             "</telphone>"+
	             "<faxphone>"+
	               "<code>20</code>"+
	               "<number>020221327</number>"+
	             "</faxphone>"+
	             "<friends>"+
	               "<name>A1</name>"+
	               "<name>A2</name>"+
	               "<name>A3</name>"+
	             "</friends>"+
	             "<pets>"+
	               "<pet>"+
	                 "<name>doly</name>"+
	                 "<age>2</age>"+
	               "</pet>"+
	               "<pet>"+
	                 "<name>hahah</name>"+
	                 "<age>3</age>"+
	               "</pet>"+
	             "</pets>"+
	           "</person>";
		 
		//用泛型的知识
	   System.out.println("xmlStr: \n" + xmlStr);
	   System.out.println();
	   PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
	   System.out.println("person=firstname=="+person.getFirstName());
	   System.out.println("person==Friends==name1=="+person.getFriend().getName());
	   System.out.println("person==Pets==name2=="+person.getPet().getAnimalList().get(1).getName());
	}
}

猜你喜欢

转载自blog.csdn.net/qingzhou4122/article/details/80982674
今日推荐