1、使用JAXB2来实现对象与XML之间的映射
JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping). 原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK6中自带的这个JAXB版本是2.0, 比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。
JAXB2Test.java:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
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.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
public class JAXB2Test {
public static void main(String[] args) throws JAXBException, IOException {
JAXBContext context = JAXBContext.newInstance(Person.class);
// 下面代码演示将对象转变为xml
Marshaller m = context.createMarshaller();
Address address = new Address("Wuhan", "jiangan", "430010");
Person p = new Person("chch", address, "se");
FileWriter fw = new FileWriter("person.xml");
m.marshal(p, fw);
// 下面代码演示将上面生成的xml转换为对象
FileReader fr = new FileReader("person.xml");
Unmarshaller um = context.createUnmarshaller();
Person p2 = (Person) um.unmarshal(fr);
System.out.println(p2);
}
}
@XmlRootElement
// 表示person是一个根元素
class Person {
@XmlAttribute
private String name; // name将作为person的的一个属性
@XmlElement
private Address address; // address将作为person的子元素
@XmlElement
private String job; // job将作为person的子元素
public Person() {
}
public Person(String name, Address address, String job) {
this.name = name;
this.address = address;
this.job = job;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(Address address) {
this.address = address;
}
public void setJob(String job) {
this.job = job;
}
public String toString() {
return name + " " + address + " " + job;
}
}
class Address {
@XmlElement
private String city;
@XmlElement
private String street;
String zipcode; // 由于没有添加@XmlElement,所以该元素不会出现在输出的xml中
public Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public void setCity(String city) {
this.city = city;
}
public void setStreet(String street) {
this.street = street;
}
public String toString() {
return city + " " + street;
}
}
生成person.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person name="chch">
<address>
<city>Wuhan</city>
<street>jiangan</street>
</address>
<job>se</job>
</person>
2、StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
StAXTest.java用来读取上面的xml:
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public class StAXTest {
public static void main(String args[]) {
Person person = null;
Address address = null;
try {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory
.createXMLStreamReader(new FileReader("person.xml"));
while (reader.hasNext()) {
String name = reader.getLocalName();
switch (reader.getEventType()) {
case XMLStreamReader.START_ELEMENT:
if (name.equals("person")) {
person = new Person();
person.setName(reader.getAttributeValue(0));
} else if (name.equals("address")) {
address = new Address();
person.setAddress(address);
} else if (name.equals("city"))
address.setCity(reader.getElementText());
else if (name.equals("street"))
address.setStreet(reader.getElementText());
else if (name.equals("job"))
person.setJob(reader.getElementText());
break;
}
reader.next();
}
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println(person);
}
}
JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping). 原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK6中自带的这个JAXB版本是2.0, 比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。
JAXB2Test.java:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
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.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
public class JAXB2Test {
public static void main(String[] args) throws JAXBException, IOException {
JAXBContext context = JAXBContext.newInstance(Person.class);
// 下面代码演示将对象转变为xml
Marshaller m = context.createMarshaller();
Address address = new Address("Wuhan", "jiangan", "430010");
Person p = new Person("chch", address, "se");
FileWriter fw = new FileWriter("person.xml");
m.marshal(p, fw);
// 下面代码演示将上面生成的xml转换为对象
FileReader fr = new FileReader("person.xml");
Unmarshaller um = context.createUnmarshaller();
Person p2 = (Person) um.unmarshal(fr);
System.out.println(p2);
}
}
@XmlRootElement
// 表示person是一个根元素
class Person {
@XmlAttribute
private String name; // name将作为person的的一个属性
@XmlElement
private Address address; // address将作为person的子元素
@XmlElement
private String job; // job将作为person的子元素
public Person() {
}
public Person(String name, Address address, String job) {
this.name = name;
this.address = address;
this.job = job;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(Address address) {
this.address = address;
}
public void setJob(String job) {
this.job = job;
}
public String toString() {
return name + " " + address + " " + job;
}
}
class Address {
@XmlElement
private String city;
@XmlElement
private String street;
String zipcode; // 由于没有添加@XmlElement,所以该元素不会出现在输出的xml中
public Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public void setCity(String city) {
this.city = city;
}
public void setStreet(String street) {
this.street = street;
}
public String toString() {
return city + " " + street;
}
}
生成person.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person name="chch">
<address>
<city>Wuhan</city>
<street>jiangan</street>
</address>
<job>se</job>
</person>
2、StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
StAXTest.java用来读取上面的xml:
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public class StAXTest {
public static void main(String args[]) {
Person person = null;
Address address = null;
try {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory
.createXMLStreamReader(new FileReader("person.xml"));
while (reader.hasNext()) {
String name = reader.getLocalName();
switch (reader.getEventType()) {
case XMLStreamReader.START_ELEMENT:
if (name.equals("person")) {
person = new Person();
person.setName(reader.getAttributeValue(0));
} else if (name.equals("address")) {
address = new Address();
person.setAddress(address);
} else if (name.equals("city"))
address.setCity(reader.getElementText());
else if (name.equals("street"))
address.setStreet(reader.getElementText());
else if (name.equals("job"))
person.setJob(reader.getElementText());
break;
}
reader.next();
}
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println(person);
}
}