JDK6新特性三——XML相关

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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值