XML 和 java对象相互转换

比眉伴天荒 2021-06-24 14:00 624阅读 0赞

xml和Java对象的转换不需要任何的第三方包,JDK自带这个转换API,方便简洁。

下面使用的是JDK自带的类,没有引用任何第三方jar包。

Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 Java 内容对象树。

备注:marshal(序列化、排列、整理)

Marshaller 类使客户端应用程序能够将 Java 内容树转换回 XML 数据。

实体类(这个是要被包含的实体类,不需要加注解)一:

  1. package org.ywzn.po;
  2. public class User {
  3. private String id;
  4. private String name;
  5. private String passwrod;
  6. public User() {
  7. super();
  8. }
  9. public User(String id, String name, String passwrod) {
  10. super();
  11. this.id = id;
  12. this.name = name;
  13. this.passwrod = passwrod;
  14. }
  15. public String getId() {
  16. return id;
  17. }
  18. public void setId(String id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public String getPasswrod() {
  28. return passwrod;
  29. }
  30. public void setPasswrod(String passwrod) {
  31. this.passwrod = passwrod;
  32. }
  33. @Override
  34. public String toString() {
  35. return "User [id=" + id + ", name=" + name + ", passwrod=" + passwrod
  36. + "]";
  37. }
  38. }

实体类二:

  1. package org.ywzn.po;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. @XmlRootElement
  4. public class Room {
  5. private String id;
  6. private String address;
  7. private User user;
  8. public Room() {
  9. super();
  10. }
  11. public Room(String id, String address, User user) {
  12. super();
  13. this.id = id;
  14. this.address = address;
  15. this.user = user;
  16. }
  17. public String getId() {
  18. return id;
  19. }
  20. public void setId(String id) {
  21. this.id = id;
  22. }
  23. public String getAddress() {
  24. return address;
  25. }
  26. public void setAddress(String address) {
  27. this.address = address;
  28. }
  29. public User getUser() {
  30. return user;
  31. }
  32. public void setUser(User user) {
  33. this.user = user;
  34. }
  35. @Override
  36. public String toString() {
  37. return "Room [id=" + id + ", address=" + address + ", user=" + user
  38. + "]";
  39. }
  40. }

注意:

1、需要转换的model对象一定要添加@XmlRootElement注解,其里面的其他对象则不需要

2、需要转换的model对象一定要有不带参数的构造方法,包括该对象里面引用的对象。

测试Java对象转xml:

  1. package org.ywzn.main;
  2. import javax.xml.bind.JAXBContext;
  3. import javax.xml.bind.JAXBException;
  4. import javax.xml.bind.Marshaller;
  5. import org.ywzn.po.Room;
  6. import org.ywzn.po.User;
  7. public class App {
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. User user = new User("1","夏小雪","111");
  11. Room room = new Room("1","桂林",user);
  12. try {
  13. JAXBContext context = JAXBContext.newInstance(Room.class);
  14. Marshaller createMarshaller = context.createMarshaller();
  15. createMarshaller.marshal(room,System.out);
  16. } catch (JAXBException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }

输出:

  1. <?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对象:

  1. package org.ywzn.main;
  2. import java.io.StringReader;
  3. import javax.xml.bind.JAXBContext;
  4. import javax.xml.bind.JAXBException;
  5. import javax.xml.bind.Unmarshaller;
  6. import org.ywzn.po.Room;
  7. public class App2 {
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. 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>";
  11. try {
  12. JAXBContext context = JAXBContext.newInstance(Room.class);
  13. Unmarshaller unmarshaller = context.createUnmarshaller();
  14. Room room = (Room)unmarshaller.unmarshal(new StringReader(xmlStr));
  15. System.out.println(room);
  16. } catch (JAXBException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }

输出:

  1. Room [id=1, address=厦门, user=User [id=1, name=易中天, passwrod=111]]

测试编码与是否省略xml头:

  1. package org.ywzn.main;
  2. import javax.xml.bind.JAXBContext;
  3. import javax.xml.bind.JAXBException;
  4. import javax.xml.bind.Marshaller;
  5. import org.ywzn.po.Room;
  6. import org.ywzn.po.User;
  7. public class Java2XMLSetEncode {
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. User user = new User("1", "夏小雪", "111");
  11. Room room = new Room("1", "桂林", user);
  12. try {
  13. JAXBContext context = JAXBContext.newInstance(Room.class);
  14. Marshaller createMarshaller = context.createMarshaller();
  15. createMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式
  16. createMarshaller
  17. .setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
  18. createMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml头信息(<?xml
  19. createMarshaller.marshal(room, System.out);
  20. } catch (JAXBException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

输出结果:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <room>
  3. <address>桂林</address>
  4. <id>1</id>
  5. <user>
  6. <id>1</id>
  7. <name>夏小雪</name>
  8. <passwrod>111</passwrod>
  9. </user>
  10. </room>

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

  1. JAXBContext 类提供到 JAXB API 的客户端入口点。它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组、编组和验证。

发表评论

表情:
评论列表 (有 0 条评论,624人围观)

还没有评论,来说两句吧...

相关阅读