最近在做项目中用到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());
}
}