package test;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
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;
import javax.xml.bind.annotation.XmlType;
import javax.xml.transform.stream.StreamSource;
@XmlAccessorType(XmlAccessType.FIELD)
//用于控制字段或属性的序列化。
//FIELD ,JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML
//NONE, 只有使用一些 JAXB 注释专门对它们进行注释的所有字段或属性才绑定到 XML。
//PROPERTY, JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML
//PUBLIC_MEMBER, 每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML
//包上的 @XmlAccessorType 注释可应用于包中的所有类
@XmlType(propOrder={"job","address"})
@XmlRootElement
//表示person是一个根元素
class Person {
// @XmlElement
// Calendar birthDay; //birthday将作为person的子元素
@XmlAttribute (name="NAME")
String name; // name将作为person的的一个属性
@XmlElement
Address address; // address将作为person的子元素
// @XmlElement
// name=“JOb”说明在xml文件元素名为“JOb”,若没有此项说明,则采用默认策略即job
@XmlElement(name="JOb")
String job; // job将作为person的子元素
public Person(){
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(Address address) {
this.address = address;
}
public Address getAddress() {
return address;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class Address {
//Address的属性
@XmlAttribute
String country;
//Address的子元素即child
@XmlElement
String state;
// @XmlElement
// String city;
// @XmlElement
// String street;
// String zipcode; //由于没有添加@XmlElement,所以该元素不会出现在输出的xml中
public Address() {
}
public String getCountry() {
return country;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public void setCountry(String country) {
this.country = country;
}
}
public class JAXB2Tester {
public static void main(String[] args) throws JAXBException, IOException {
JAXBContext context = JAXBContext.newInstance(Person.class);
// 下面代码演示将对象转变为xml
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// Address address = new Address("China", "Beijing", "Beijing", "ShangDi
// West", "100080");
Address address = new Address();
address.setCountry("China");
address.setState("beijing");
// Person p = new Person(Calendar.getInstance(), "JAXB2", address,
// Gender.MALE, "SW");
Person p = new Person();
p.setName("zhangsan");
p.setJob("gongzuo");
p.setAddress(address);
FileWriter fw = new FileWriter("d:/person.xml");
Writer w = new StringWriter();
//输出到控制台
m.marshal(p, System.out);
//导入到文件
m.marshal(p, fw);
//导入到字符流中
m.marshal(p, w);
// 下面代码演示将上面生成的xml转换为对象
Unmarshaller um = context.createUnmarshaller();
FileReader fr = new FileReader("d:/person.xml");
//从xml文件中解析
// um.unmarshal(new File("d:\person.xml"));
//从字节流中解析
// um.unmarshal(new FileInputStream("d:\person.xml"));
//从字符流中解析
Person p2 = (Person) um.unmarshal(new StreamSource(new StringReader(w.toString())));
System.out.println("Country:" + p2.getAddress().getCountry());
}
}