XML 和 java对象相互转换
xml和Java对象的转换不需要任何的第三方包,JDK自带这个转换API,方便简洁。
下面使用的是JDK自带的类,没有引用任何第三方jar包。
Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 Java 内容对象树。
备注:marshal(序列化、排列、整理)
Marshaller 类使客户端应用程序能够将 Java 内容树转换回 XML 数据。
实体类(这个是要被包含的实体类,不需要加注解)一:
package org.ywzn.po;
public class User {
private String id;
private String name;
private String passwrod;
public User() {
super();
}
public User(String id, String name, String passwrod) {
super();
this.id = id;
this.name = name;
this.passwrod = passwrod;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswrod() {
return passwrod;
}
public void setPasswrod(String passwrod) {
this.passwrod = passwrod;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", passwrod=" + passwrod
+ "]";
}
}
实体类二:
package org.ywzn.po;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Room {
private String id;
private String address;
private User user;
public Room() {
super();
}
public Room(String id, String address, User user) {
super();
this.id = id;
this.address = address;
this.user = user;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Room [id=" + id + ", address=" + address + ", user=" + user
+ "]";
}
}
注意:
1、需要转换的model对象一定要添加@XmlRootElement注解,其里面的其他对象则不需要
2、需要转换的model对象一定要有不带参数的构造方法,包括该对象里面引用的对象。
测试Java对象转xml:
package org.ywzn.main;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.ywzn.po.Room;
import org.ywzn.po.User;
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("1","夏小雪","111");
Room room = new Room("1","桂林",user);
try {
JAXBContext context = JAXBContext.newInstance(Room.class);
Marshaller createMarshaller = context.createMarshaller();
createMarshaller.marshal(room,System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><room><address>桂林</address><id>1</id><user><id>1</id><name>夏小雪</name><passwrod>111</passwrod></user></room>
测试xml转Java对象:
package org.ywzn.main;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.ywzn.po.Room;
public class App2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><room><address>厦门</address><id>1</id><user><id>1</id><name>易中天</name><passwrod>111</passwrod></user></room>";
try {
JAXBContext context = JAXBContext.newInstance(Room.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Room room = (Room)unmarshaller.unmarshal(new StringReader(xmlStr));
System.out.println(room);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
输出:
Room [id=1, address=厦门, user=User [id=1, name=易中天, passwrod=111]]
测试编码与是否省略xml头:
package org.ywzn.main;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.ywzn.po.Room;
import org.ywzn.po.User;
public class Java2XMLSetEncode {
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("1", "夏小雪", "111");
Room room = new Room("1", "桂林", user);
try {
JAXBContext context = JAXBContext.newInstance(Room.class);
Marshaller createMarshaller = context.createMarshaller();
createMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式
createMarshaller
.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
createMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml头信息(<?xml
createMarshaller.marshal(room, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
输出结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<room>
<address>桂林</address>
<id>1</id>
<user>
<id>1</id>
<name>夏小雪</name>
<passwrod>111</passwrod>
</user>
</room>
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
JAXBContext 类提供到 JAXB API 的客户端入口点。它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组、编组和验证。
还没有评论,来说两句吧...