`

【转载】JAXB的使用

    博客分类:
  • web
 
阅读更多

转载地址:http://blog.csdn.net/zxy838279821/article/details/7618360

jaxb:Java Architecture for XML Binding

 

1.Bind the Schema

 

将XSD文件解析成javabean

 

在java1.5一下的版本 需要下载JAXB

 

在java1.6中,java已经将JAXB集成进来

 

此时我们只要进入到%JAVA_HOME%/bin目录下执行命令:xjc  books.xsd -p test.jaxb  -d work

 

其中参数-p表示Package     -d表示生产文件的Directry;

 

之后便会生成javabean对象

 

 

 

2、Unmarshalling an XML document 解组XML文档

 

javax.xml.bind.JAXBContext  是java1.6新加进来的包

 

JAXBContext jc = JAXBContext.newInstance("test.jaxb");    //test.jaxb是XML Schema所生成的javaBean所在的包名

 

Unmarshaller unmarshaller = jc.createUnmarshaller();   //创建借组程序对象

 

Collection collection= (Collection)    unmarshaller.unmarshal(new File( "books.xml"));     //指定借组对象  其中Collection对象是bind Schema都会生成的一个类

 

从该类派生的对象可以获取根节点元素,再从根节点元素获取各个子节点 从而可以获得各个节点的值

 

List<BookType> bookList = booksType.getBook();

        for (int i = 0; i < bookList.size(); i++) {
            System.out.println("Book  details ");
            test.jaxb.BookType book = (test.jaxb.BookType) bookList.get(i);
            System.out.println("Item id: " + book.getItemId());
            System.out.println("Book Name: " + book.getName().trim());
            System.out.println("Book ISBN: " + book.getISBN());
            System.out.println("Book Price: " + book.getPrice().trim());
            System.out.println("Book category: " + book.getBookCategory());
            System.out.println("Book promotion: " + book.getPromotion().getDiscount().trim());
            System.out.println("No of Authors " + book.getAuthors().getAuthorName().size());
            BookType.AuthorsType authors = book.getAuthors();
            for (int j = 0; j < authors.getAuthorName().size(); j++) {
                String authorName = (String) authors.getAuthorName().get(j);
                System.out.println("Author Name " + authorName.trim());
            }
            System.out.println();
        }

 

 

效果 :

 

Book  details 
Item id: 999
Book Name: Learning JAXB
Book ISBN: 123445
Book Price: 34 $
Book category: other
Book promotion: 10% on this book if purchased by March 2003
No of Authors 1
Author Name Jane Doe

Book  details 
Item id: 129
Book Name: Java Webservices today and Beyond
Book ISBN: 522965
Book Price: 29 $
Book category: magazine
Book promotion: Buy one get Learning webservices Part 1 free
No of Authors 2
Author Name John Brown
Author Name Peter T.

 JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换。在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版本JAX-WS2.1,其底层支持就是JAXB。

   
 JAXB 
可以实现Java对象与XML的相互转换,在JAXB中,将一个Java对象转换为XML的过程称之为Marshal,将XML转换为Java对象的过程
称之为UnMarshal。我们可以通过在 Java 
类中标注注解的方式将一个Java对象绑定到一段XML,也就是说,在Java类中标注一些注解,这些注解定义了如何将这个类转换为XML,怎么转换,以
及一段XML如何被解析成这个类所定义的对象;也可以使用JAXB的XJC工具,通过定义schema的方式实现Java对象与XML的绑定(这个下次研
究)。

    下面来了解一下如何通过标注注解来完成 Marshal 和 UnMarshal 的过程。我用的是 JAXB2_20101209.jar ,可以到http://jaxb.java.net/下载最新版本。

 

首先看个小例子:



定义一个java类

Java代码
package com.why.jaxb;   
  
import javax.xml.bind.annotation.XmlRootElement;   
  
@XmlRootElement  
public class People {   
    public String id = "001";   
    public String name = "灰太狼";   
    public int age = 26;   
}  

//我们在实际中一般在get方法上添加相关注解
Java To XML(Marshal)

Java代码
package com.why.jaxb;   
  
import javax.xml.bind.JAXBContext;   
import javax.xml.bind.JAXBException;   
import javax.xml.bind.Marshaller;   
  
public class Java2XML {   
  
    /**  
     * @param args  
     * @throws JAXBException   
     */  
    public static void main(String[] args) throws JAXBException {   
        JAXBContext context = JAXBContext.newInstance(People.class);   
           
        Marshaller marshaller = context.createMarshaller();   
        marshaller.setProperty(Marshaller.JAXB_ENCODING,"gb2312");//编码格式

        //我在实际开发中重新封装了JAXB基本类,这里就使用到了该属性。不过默认的编码格式UTF-8

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);//是否格式化生成的xml串   
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);//是否省略xml头信息(<?xml version="1.0" encoding="gb2312" standalone="yes"?>)   
           
        People people = new People();   
        marshaller.marshal(people, System.out);   
    }   
  
}  

XML To Java(UnMarshal)

Java代码
package com.why.jaxb;   
  
import java.io.File;   
import javax.xml.bind.JAXBContext;   
import javax.xml.bind.JAXBException;   
import javax.xml.bind.Unmarshaller;   
import org.xml.sax.SAXException;   
  
public class XML2Java {   
    /**  
     * @param args  
     * @throws JAXBException   
     * @throws JAXBException   
     * @throws SAXException   
     */  
    public static void main(String[] args) throws JAXBException {   
        JAXBContext context = JAXBContext.newInstance(People.class);   
        Unmarshaller unmarshaller = context.createUnmarshaller();   
        File file = new File("src/people.xml");   
        People people = (People)unmarshaller.unmarshal(file);   
        System.out.println(people.id);   
        System.out.println(people.name);   
        System.out.println(people.age);   
    }   
}

 

       其实Marshal 和 UnMarshal的过程并不复杂,只需要从JAXBContext中获得Marshaller或Unmarshaller对象,就可以让JAXB帮我们 来进行转换了。我们需要操作的主要内容是定义一个规则,告诉JAXB如何将一个类、按照什么样的格式转换为XML,下面是JAXB中主要的一些注解。



@XmlRootElement   将一个Java类映射为一段XML的根节点

参数:name            定义这个根节点的名称

          namespace   定义这个根节点命名空间



@XmlAccessorType  定义映射这个类中的何种类型需要映射到XML。可接收四个参数,分别是:

      XmlAccessType.FIELD:映射这个类中的所有字段到XML

      XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML

      XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)

      XmlAccessType.NONE:不映射



@XmlElement  指定一个字段或get/set方法映射到XML的节点。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。

参数:defaultValue  指定节点默认值

         name             指定节点名称

         namespace    指定节点命名空间

         required         是否必须(默认为false)

         nillable           该字段是否包含 nillable="true" 属性(默认为false)

         type               定义该字段或属性的关联类型



@XmlAttribute  指定一个字段或get/set方法映射到XML的属性。

参数:name             指定属性名称

         namespace    指定属性命名空间

         required         是否必须(默认为false)



@XmlTransient  定义某一字段或属性不需要被映射为XML。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。



@XmlType 定义映射的一些相关规则

参数:propOrder        指定映射XML时的节点顺序

         factoryClass     指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身

         factoryMethod  指定工厂类的工厂方法

         name               定义XML Schema中type的名称

         namespace      指定Schema中的命名空间



@XmlElementWrapper  为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为

    <items>...</items>

    <items>...</items>

这种形式,此注解可将这个元素进行包装,如:

    @XmlElementWrapper(name="items")
    @XmlElement(name="item")
    public List items;

将会生成这样的XML样式:

    <items>

        <item>...</item>

        <item>...</item>

    </items>



@XmlJavaTypeAdapter  自定义某一字段或属性映射到XML的适配器。如,类中包含一个接口,我们可以定义一个适配器(继承自 javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接口如何映射到XML。
@XmlSchema 配置整个包的namespace,这个注解需放在package-info.java文件中。

jaxb编码:

           JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            InputStreamReader reader=new InputStreamReader(inputStream,"GBK");   //在此修改编码
            return unmarshaller.unmarshal(reader);

分享到:
评论

相关推荐

    如何更好地jaxb使用

    如何更好地jaxb使用如何更好地jaxb使用如何更好地jaxb使用如何更好地jaxb使用

    JAXB使用及代码示例

    1. **编译时绑定**:在开发阶段,JAXB使用`xjc`工具将XML Schema(XSD)文件转换为一组Java类,这些类包含了对XML结构的表示。这个过程也被称为“逆向工程”。 2. **运行时转换**:在程序运行时,JAXB提供了一组API...

    jaxb 使用实例

    ### JAXB使用步骤 1. **创建Java模型类**:定义要序列化的Java类,使用注解如`@XmlRootElement`,`@XmlElement`等来标注字段。 2. **设置JAXB上下文**:使用`JAXBContext`来获取Java类型和XML之间的映射信息。这...

    jaxb开发使用文档

    jaxb开发使用文档 JAXB(Java Architecture for XML Binding)是一种java标准库,用于处理XML与java对象的映射。jaxb技术在javaSE6.0中已经包含了jaxb定义的所有API,在处理XML文档时,使用jaxb要比使用JAXP(DOM、...

    JAXB使用经验总结

    1. 什么是JAXB?  Java Architecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML

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

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

    android上使用 jaxb所需要的包

    为了在Android应用中使用JAXB,我们需要手动引入相关的jar包。 在给定的文件列表中,有三个关键的jar包: 1. `jaxb-api-2.2.7.jar`:这是JAXB的主要API,提供了基本的接口和类,如`javax.xml.bind.JAXBContext`和`...

    JAXB使用Socket流进行双向通信源码

    在本示例中,"JAXB使用Socket流进行双向通信源码"结合了这两个概念,创建了一个基于Java的客户端(Client_Socket)应用,实现了XML数据在客户端和服务端之间的双向传输。 首先,我们要理解JAXB的工作原理。JAXB允许...

    JAXB的 eclipse插件

    对于Java开发者来说,熟练掌握JAXB以及相关的Eclipse插件使用方法是十分必要的,因为这不仅可以简化XML处理的复杂性,还能使项目代码更符合Java的最佳实践。 总结一下,JAXB的Eclipse插件是Java开发者处理XML数据的...

    idea 中用jaxb 读xml中数据

    在Idea中使用JAXB,我们需要遵循以下步骤: 1. **创建Java类**:首先,我们需要定义与XML元素相对应的Java类。这些类会包含对应XML节点的属性。例如,如果XML文件有`&lt;person&gt;`标签,我们可以创建一个`Person`类,...

    JAXB的安装包及插件

    **JAXB(Java ...总之,JAXB是Java开发中处理XML数据的重要工具,它的安装和使用极大地提高了开发效率,使得XML数据的处理更加便捷。通过理解和熟练掌握JAXB,开发者可以更好地构建和维护XML相关的应用程序。

    javax.rar(jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0)

    因此,在Java 9及更高版本中,如果项目需要使用JAXB,必须明确声明依赖。 `jaxb-api-2.3.0.jar`是JAXB的API接口定义,包含了用于创建和操作XML绑定的类和接口。这个API层不包含实际的实现,而是提供给应用调用的...

    JAXB实例入门

    ### JAXB使用场景 - 数据交换:在分布式系统中,服务间通信常通过XML格式的数据交换,JAXB提供了便捷的序列化和反序列化手段。 - 配置文件解析:XML常被用作应用程序的配置文件,JAXB能帮助解析和操作这些配置。 - ...

    jaxb-api jaxb-impl jar

    JAXB允许开发者将XML文档转换为可以直接在Java应用程序中使用的对象,同时也能够将Java对象转换为XML格式的数据。这在处理XML数据时极大地提高了效率和便利性。 `jaxb-api`和`jaxb-impl`是JAXB框架的核心组成部分。...

    jaxb-api-2.1.jar 和 jaxb-impl-2.1.8.jar

    在使用这两个库文件时,通常需要同时包含`jaxb-api.jar`和`jaxb-impl.jar`,因为API库提供了接口定义,而实现库提供了具体的实现。有时候,为了完整支持JAXB功能,可能还需要其他相关库,如`activation.jar`...

    JAXB的使用JAXB的使用

    2. **生成Java类**:如果已有XML Schema(XSD),可以使用JAXB的`xjc`工具自动生成符合Schema的Java类。 3. **绑定上下文(Context)**:创建`JAXBContext`对象,它是整个JAXB操作的核心,负责管理和维护Java类型与...

    jaxb (XML操作)

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

    JAXB乱码问题解决

    在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将XML文档和Java对象之间进行绑定的技术。在处理XML文件时,特别是涉及到...遵循这些原则,可以有效地避免在Java开发中使用JAXB时出现的乱码问题。

    jaxb api jar

    使用JAXB,开发者首先需要定义Java类来表示XML结构,然后通过JAXB的`@XmlRootElement`和`@XmlElement`等注解来标注这些类,以便JAXB能够理解它们与XML元素的对应关系。接着,可以使用`JAXBContext`来创建一个上下文...

Global site tag (gtag.js) - Google Analytics