JAXB可以实现XML和Object的自动转换,这样我们就不用再自己写xml的解析了。
1、从xml文件读取自动转换成Object
2、从xml字符串读取自动转换成Object
3、把对象转化成xml输出到控制台
4、把对象转化成xml输出到文件
5、把对象转化成xml字符串
vdi.xml
<?xml version="1.0" encoding="UTF-8"?> <vdis size="2" batch_number="20141212123456" errmsg=""> <vdi> <id>1</id> <uuid>6524552158933218</uuid> <name>disk1</name> <disk_size>20</disk_size> </vdi> <vdi> <id>2</id> <uuid>6524552158933123</uuid> <name>disk2</name> <disk_size>40</disk_size> </vdi> </vdis>
Vdis.java
package com.chinac.jaxb.parsexml; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "vdis") @XmlAccessorType(XmlAccessType.FIELD) public class Vdis extends ArrayList<Vdi>{ @XmlAttribute(name = "size") private int size; @XmlAttribute(name = "batch_number") private Long batchNumber; @XmlAttribute(name = "errmsg") private String errmsg; @XmlElement(name = "vdi") private List<Vdi> getVdis(){ return this; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public Long getBatchNumber() { return batchNumber; } public void setBatchNumber(Long batchNumber) { this.batchNumber = batchNumber; } public String getErrmsg() { return errmsg; } public void setErrmsg(String errmsg) { this.errmsg = errmsg; } @Override public String toString() { return "size:"+size + ",batchNumber:"+batchNumber + ",errmsg:"+errmsg + ""; } }
Vdi.java
package com.chinac.jaxb.parsexml; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @XmlAccessorType(XmlAccessType.FIELD) public class Vdi { @XmlElement(name = "id") private int id; @XmlElement(name = "uuid") private String uuid; @XmlElement(name = "name") private String name; @XmlElement(name = "disk_size") private int diskSize; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDiskSize() { return diskSize; } public void setDiskSize(int diskSize) { this.diskSize = diskSize; } @Override public String toString() { return "id:"+id + ",uuid:"+uuid + ",name:"+name + ",diskSize:"+diskSize; } }
Test.java
package com.chinac.jaxb.test; import java.io.File; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.transform.stream.StreamSource; import com.chinac.jaxb.parsexml.Vdi; import com.chinac.jaxb.parsexml.Vdis; @SuppressWarnings("unchecked") public class Test { //从xml文件读取 public static <T> T readFromFile(Class<T> clazz , String filePath) throws JAXBException{ JAXBContext jc = JAXBContext.newInstance(clazz); Unmarshaller unmarshaller = jc.createUnmarshaller(); return (T) unmarshaller.unmarshal(new File(filePath)); } //从xml字符串读取 public static <T> T readFromString(Class<T> clazz , StringBuffer xmlStr) throws JAXBException{ JAXBContext jc = JAXBContext.newInstance(clazz); Unmarshaller unmarshaller = jc.createUnmarshaller(); return (T) unmarshaller.unmarshal(new StreamSource(new StringReader(xmlStr.toString()))); } //把对象转化成xml输出到控制台 public static <T> void writeToConsole(Class<T> clazz , T t) throws JAXBException{ JAXBContext cxt = JAXBContext.newInstance(clazz); Marshaller marshaller = cxt.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 默认false表示xml指令存在 marshaller.marshal(t, System.out); } //把对象转化成xml输出到文件 public static <T> void writeToFile(Class<T> clazz , T t , String filePath) throws JAXBException{ JAXBContext cxt = JAXBContext.newInstance(clazz); Marshaller marshaller = cxt.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 默认false表示xml指令存在 marshaller.marshal(t, new File(filePath)); } //把对象转化成xml字符串 public static <T> String writeToString(Class<T> clazz , T t) throws JAXBException{ JAXBContext cxt = JAXBContext.newInstance(clazz); Marshaller marshaller = cxt.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 默认false表示xml指令存在 StringWriter writer = new StringWriter(); marshaller.marshal(t, writer); return writer.toString(); } public static void main(String[] args) throws JAXBException { //从xml文件读取 String filePath = "./src/vdi.xml"; Vdis vdis1 = Test.readFromFile(Vdis.class, filePath); System.out.println(vdis1.toString()); for(Vdi vdi : vdis1){ System.out.println(vdi); } //从xml字符串读取 StringBuffer xmlStr = new StringBuffer("<?xml version="1.0" encoding="UTF-8"?>" + "<vdis size="2" batch_number="20141212123456" errmsg="">" + "<vdi>" + "<id>1</id>" + "<uuid>6524552158933218</uuid>" + "<name>disk1</name>" + "<disk_size>20</disk_size>" + "</vdi>" + "<vdi>" + "<id>2</id>" + "<uuid>6524552158933123</uuid>" + "<name>disk2</name>" + "<disk_size>40</disk_size>" + "</vdi>" + "</vdis>"); Vdis vdis2 = Test.readFromString(Vdis.class, xmlStr); System.out.println(vdis2.toString()); for(Vdi vdi : vdis2){ System.out.println(vdi); } //把对象转化成xml输出到控制台 Test.writeToConsole(Vdis.class, vdis2); //把对象转化成xml输出到文件 String filePath2 = "./src/test.xml"; Test.writeToFile(Vdis.class, vdis2, filePath2); //把对象转化成xml字符串 String xmlStr2 = Test.writeToString(Vdis.class, vdis2); System.out.println(xmlStr2); } }
注意:
用了@XmlAccessorType(XmlAccessType.FIELD)、@XmlElement、@XmlAttribute注解后,属性自己的getter/setter方法就会被忽略,去掉这些主键使用属性自己的getter/setter方法一样可以。
简洁版:
Vdis.java
package com.chinac.jaxb.parsexml; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "vdis") @XmlAccessorType(XmlAccessType.FIELD) public class Vdis extends ArrayList<Vdi>{ @XmlAttribute(name = "size") private int size; @XmlAttribute(name = "batch_number") private Long batchNumber; @XmlAttribute(name = "errmsg") private String errmsg; @XmlElement(name = "vdi") private List<Vdi> getVdis(){ return this; } @Override public String toString() { return "size:"+size + ",batchNumber:"+batchNumber + ",errmsg:"+errmsg + ""; } }
Vdi.java
package com.chinac.jaxb.parsexml; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @XmlAccessorType(XmlAccessType.FIELD) public class Vdi { @XmlElement(name = "id") private int id; @XmlElement(name = "uuid") private String uuid; @XmlElement(name = "name") private String name; @XmlElement(name = "disk_size") private int diskSize; @Override public String toString() { return "id:"+id + ",uuid:"+uuid + ",name:"+name + ",diskSize:"+diskSize; } }
自主版:
Vdis.java
package com.chinac.jaxb.parsexml; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "vdis") @XmlAccessorType(XmlAccessType.FIELD) public class Vdis extends ArrayList<Vdi>{ private int size; private Long batchNumber; private String errmsg; private List<Vdi> getVdis(){ return this; } public int getSize() { System.out.println("aaa"); return size; } public void setSize(int size) { System.out.println("bbb"); this.size = size; } public Long getBatchNumber() { return batchNumber; } public void setBatchNumber(Long batchNumber) { this.batchNumber = batchNumber; } public String getErrmsg() { return errmsg; } public void setErrmsg(String errmsg) { this.errmsg = errmsg; } @Override public String toString() { return "size:"+size + ",batchNumber:"+batchNumber + ",errmsg:"+errmsg + ""; } }
Vdi.java
package com.chinac.jaxb.parsexml; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; public class Vdi { private int id; private String uuid; private String name; private int diskSize; public int getId() { System.out.println("ccc"); return id; } public void setId(int id) { System.out.println("ddd"); this.id = id; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDiskSize() { return diskSize; } public void setDiskSize(int diskSize) { this.diskSize = diskSize; } @Override public String toString() { return "id:"+id + ",uuid:"+uuid + ",name:"+name + ",diskSize:"+diskSize; } }