`
huttoncs
  • 浏览: 200861 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAXB基本使用

    博客分类:
  • java
 
阅读更多

本文主要参考了http://www.cnblogs.com/lzrabbit/p/3657854.html

JAXB主要用来实现对象和XML之间的序列化和反序列化,关于JAXB的介绍就不多说了,网上一搜一大把,这里主要总结下基本使用方法和一些注意事项

首先定义两个示例类ClassA,ClassB,用于后续的示例演示

 

package com.hutton.client.vo;

import javax.xml.bind.annotation.XmlAccessOrder;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 * @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:
 * AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序
 * XmlAccessOrder.UNDEFINED:不排序
 * @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性
 * 在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错
 * */

@XmlRootElement(name="ClassA")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
     "classB",
     "classAName",
     "type"
 })
//@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class ClassA {
 private String type;
 @XmlAttribute(name="id")
    private int classAId;
    private String classAName;

    private ClassB classB;
   
   

    public int getClassAId() {
        return classAId;
    }

    public void setClassAId(int classAId) {
        this.classAId = classAId;
    }

    public String getClassAName() {
        return classAName;
    }

    public void setClassAName(String classAName) {
        this.classAName = classAName;
    }

    public ClassB getClassB() {
        return classB;
    }

    public void setClassB(ClassB classB) {
        this.classB = classB;
    }

 public String getType() {
  return type;
 }

 public void setType(String type) {
  this.type = type;
 }
   
}
 package com.hutton.client.vo;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ClassB {
    private int classBId;
    private String classBName;

    public int getClassBId() {
        return classBId;
    }

    @XmlAttribute(name="id")
    public void setClassBId(int classBId) {
        this.classBId = classBId;
    }

    public String getClassBName() {
        return classBName;
    }

    public void setClassBName(String classBName) {
        this.classBName = classBName;
    }
}


用于序列化的XmlUtil

 

package com.hutton.client.utils;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class XmlUtil {

    public static String toXML(Object obj) {
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm头声明信息
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @SuppressWarnings("unchecked")
    public static <T> T fromXML(String xml, Class<T> valueType) {
        try {
            JAXBContext context = JAXBContext.newInstance(valueType);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}
调用如下:

package docment.jaxb;

import com.hutton.client.utils.XmlUtil;
import com.hutton.client.vo.ClassA;
import com.hutton.client.vo.ClassB;

public class XmlUtilTest {

 public static void main(String[] args) {
  ClassB classB = new ClassB();
        classB.setClassBId(22);
        classB.setClassBName("B2");

        ClassA classA = new ClassA();
        classA.setClassAId(11);
        classA.setClassAName("A1");
        classA.setClassB(classB);
        classA.setType("test");
        System.out.println(XmlUtil.toXML(classA));
 }

}

 

运行结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ClassA id="11">
    <classB id="22">
        <classBName>B2</classBName>
    </classB>
    <classAName>A1</classAName>
    <type>test</type>
</ClassA>

 

 

这里要注意以下几点

  1. 要序列化的类加上 @XmlRootElement注解,否则会报错(错误提示很清晰,这里就不贴出来了)
  2. JAXB序列化XML时  默认序列化getter和setter,且getter和setter必须成对出现才会被序列化

   3. 属性名称,默认序列化出来的类和属性名称默认是首字母转换为小写,若需要控制属性名称需要在getter或setter上使用 @XmlElement(name="ClassAId") 指定名称,这里要注意的是@XmlElement放置在getter或setter上都行,但只能放一个,也就是说不能同时在getter和setter上使用@XmlElement注解;也可以为每个属性设置@XmlElement(name=""),这里的name就是生成的XML中的节点名

  4. 如何控制根节点名称?
   使用@XmlRootElement指定name属性即可,如@XmlRootElement(name="ClassA")

 5. 怎么添加命名空间
使用@XmlRootElement(namespace="cn.lzrabbit") 指定namespace属性

 

 

下面摘录了一些对常用注解的描述

一.Jaxb处理java对象和xml之间转换常用的annotation有:

  1. @XmlType
  2. @XmlElement
  3. @XmlRootElement
  4. @XmlAttribute
  5. @XmlAccessorType
  6. @XmlAccessorOrder
  7. @XmlTransient
  8. @XmlJavaTypeAdapter

二.常用annotation使用说明

  1. @XmlType

  @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

  2.@XmlElement

  @XmlElement将Java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:

  @XmlElement(name="Address")  
  private String yourAddress;

  3.@XmlRootElement

  @XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:

  @XmlType
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlRootElement
  public class Address {}

  4.@XmlAttribute

  @XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:
  @XmlAttribute(name="Country")
  private String state;

  5.@XmlAccessorType

  @XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分   别为:

  XmlAccessType.FIELD:java对象中的所有成员变量

  XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量

  XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量

  XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素

  注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在   private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限   为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

  6.@XmlAccessorOrder

  @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:

  AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序

  XmlAccessOrder.UNDEFINED:不排序

  7.@XmlTransient

  @XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

  8.@XmlJavaTypeAdapter

  @XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

  @XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类

  XmlAdapter如下:

public abstract class XmlAdapter<ValueType,BoundType> {
    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
 }

 

 

分享到:
评论

相关推荐

    JAXB使用及代码示例

    - JAXB默认处理的仅是基本类型和String,对于自定义对象,需要使用注解进行映射。 - 对于大型项目,可能需要考虑性能问题,因为JAXB涉及大量的反射操作。 总之,JAXB为Java开发者提供了一种强大而便捷的方式来处理...

    [精品]JAVA6新特性介绍使用JAXB来实现对象与XML之间的映射.doc

    【JAXB基本使用示例】 以下代码展示了如何使用JAXB进行对象到XML的序列化和反序列化: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; // ...

    JAXB的使用JAXB的使用

    ### JAXB的基本概念 1. **Java类到XML Schema的映射**:通过`@XmlRootElement`和`@XmlElement`等注解,可以将Java类和其属性映射为XML元素和属性。例如,一个名为`Person`的类可以通过注解映射到一个XML文档的根...

    JAXB的安装包及插件

    对于IntelliJ IDEA,虽然内置了一些基本的JAXB支持,但也可以安装如"Java2WSDL"这样的插件来增强功能。 **JAXB的基本用法** - **生成Java类**:JAXB提供了一个工具`xjc`,可以将XML Schema文档转换为对应的Java类...

    axis部署WebServices 和 JAXB的使用

    在这个"axis部署WebServices 和 JAXB的使用"主题中,我们将深入探讨这两个关键技术及其协同工作。 首先,让我们关注Axis的部署过程。Axis1.3是Axis的一个较旧版本,但仍然适用于许多遗留系统。部署Web服务的基本...

    jaxb 使用实例

    ### JAXB的基本概念 1. **Java类到XML的映射(Marshalling)**:将Java对象转换为XML文档的过程称为Marshalling。JAXB通过`Marshaller`接口来实现这个功能,它提供了一系列方法将Java对象转换成XML格式的字符串或者...

    android上使用 jaxb所需要的包

    1. `jaxb-api-2.2.7.jar`:这是JAXB的主要API,提供了基本的接口和类,如`javax.xml.bind.JAXBContext`和`javax.xml.bind.Marshaller`,用于实现XML和Java对象的转换。`JAXBContext`是整个转换过程的核心,负责创建...

    JAXB 利用xsd文件生成java类

    JAXB (Java Architecture for XML Binding) 是Java平台上的一个标准,用于将XML文档与Java对象之间进行绑定,...在JAXB-Sunshine7这个示例中,可能包含了一个或多个关于如何使用JAXB从XSD生成Java类的演示和实践案例。

    jaxb (XML操作)

    2. **实例化(Unmarshalling)**:当需要将XML数据转换为Java对象时,JAXB使用Unmarshaller接口解析XML文档,生成对应的Java对象。这个过程是将XML数据"反序列化"为可操作的Java对象。 3. **序列化(Marshalling)*...

    JAXB注解命名空间使用到的jar包

    5. **处理命名空间的jar包**:虽然JDK 1.6内置了基本的JAXB实现,但处理特定的命名空间或扩展功能可能需要额外的库,如`jaxb-api.jar`、`jaxb-impl.jar`和`javax.xml.bind.annotation.jar`等。这些jar包提供了完整的...

    JAXB实例入门

    在本文中,我们将探讨JAXB的基本概念、使用场景以及如何通过一个简单的实例来入门。 ### JAXB的核心功能 1. **对象到XML的序列化**:JAXB能够将Java对象转换为XML文档,使得Java应用程序能够方便地生成XML输出。 2...

    利用JAXB进行xml和javabean之间转换

    首先,我们需要了解JAXB的基本工作原理。JAXB通过元数据(如注解或XML绑定文件)来映射Java类到XML元素,以及XML元素到Java类。这使得XML文档能够被自动解析成Java对象,反之亦然。 **1. JAXB的使用步骤** (1) **...

    利用jaxb实现xml和bean互转

    **一、JAXB的基本概念** 1. **Java Bean**: Java Bean是Java中的一个简单对象,通常具有getter和setter方法,用于封装数据。在JAXB中,这些Bean类会被映射到XML元素和属性。 2. **XML Schema**: 定义了XML文档的...

    jaxb-impl.jar包

    4. **API支持**:`jaxb-impl.jar`包含JAXB的主要API,如`Unmarshaller`、`Marshaller`、`Binder`等接口,它们提供了XML和Java对象之间转换的基本操作。 **版本差异** 在提供的压缩包中,有两个不同版本的`jaxb-...

    JAXB2 jaxb-api.jar jaxb-xjc.jar jaxb-impl.jar activation.jar

    如果在你的项目中需要使用JAXB2来处理XML,你可以将这些jar添加到项目的类路径中,以确保所有必要的依赖都已到位。例如,在Maven或Gradle项目中,可以通过配置依赖管理来引用这些库。在传统的Java应用中,你可能需要...

    java学习之jaxb的学习一

    三、JAXB的基本使用 1. 定义Java类:首先,我们需要定义一个Java类,该类的属性对应XML文档中的元素和属性。JAXB会自动为这些属性生成getter和setter方法。 2. 创建JAXBContext:这是JAXB的核心,负责管理和控制XML...

    jaxb xml 转map

    首先,我们需要了解JAXB的基本用法。JAXB的工作原理是基于Java类来生成XML schema,或者反过来基于XML schema生成Java类。当我们有一个XML文档,我们可以创建对应的Java类,这些类将作为映射的基础。然后,JAXB会...

    jaxb解析xml

    2. 使用 JAXB 的 XJC 工具,通过定义 schema 的方式实现 Java 对象与 XML 的绑定。 ### 3.2 JAXB Annotation 使用说明 #### 3.2.1 @XmlType @XmlType 定义映射的一些规则,用在 class 类的注解,常与 @...

    JAXB.zip_jaxb

    通过分析这个"JAXB.zip_jaxb"压缩包的内容,我们可以学习到如何在NetBeans中创建和管理一个JAXB项目,理解JAXB的基本原理和用法,以及如何利用Ant进行构建和测试。这不仅有助于加深对JAXB的理解,也能够提升在实际...

Global site tag (gtag.js) - Google Analytics