Jaxb 通过bean与xml交互

本文介绍了一个使用Java Architecture for XML Binding (JAXB) 进行对象与XML文件互相转换的例子。通过定义Person和Address类,并使用JAXB API实现这些类的实例与XML之间的映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值