转载地址: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使用
1. **编译时绑定**:在开发阶段,JAXB使用`xjc`工具将XML Schema(XSD)文件转换为一组Java类,这些类包含了对XML结构的表示。这个过程也被称为“逆向工程”。 2. **运行时转换**:在程序运行时,JAXB提供了一组API...
### JAXB使用步骤 1. **创建Java模型类**:定义要序列化的Java类,使用注解如`@XmlRootElement`,`@XmlElement`等来标注字段。 2. **设置JAXB上下文**:使用`JAXBContext`来获取Java类型和XML之间的映射信息。这...
jaxb开发使用文档 JAXB(Java Architecture for XML Binding)是一种java标准库,用于处理XML与java对象的映射。jaxb技术在javaSE6.0中已经包含了jaxb定义的所有API,在处理XML文档时,使用jaxb要比使用JAXP(DOM、...
1. 什么是JAXB? Java Architecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML
如果在你的项目中需要使用JAXB2来处理XML,你可以将这些jar添加到项目的类路径中,以确保所有必要的依赖都已到位。例如,在Maven或Gradle项目中,可以通过配置依赖管理来引用这些库。在传统的Java应用中,你可能需要...
为了在Android应用中使用JAXB,我们需要手动引入相关的jar包。 在给定的文件列表中,有三个关键的jar包: 1. `jaxb-api-2.2.7.jar`:这是JAXB的主要API,提供了基本的接口和类,如`javax.xml.bind.JAXBContext`和`...
在本示例中,"JAXB使用Socket流进行双向通信源码"结合了这两个概念,创建了一个基于Java的客户端(Client_Socket)应用,实现了XML数据在客户端和服务端之间的双向传输。 首先,我们要理解JAXB的工作原理。JAXB允许...
对于Java开发者来说,熟练掌握JAXB以及相关的Eclipse插件使用方法是十分必要的,因为这不仅可以简化XML处理的复杂性,还能使项目代码更符合Java的最佳实践。 总结一下,JAXB的Eclipse插件是Java开发者处理XML数据的...
在Idea中使用JAXB,我们需要遵循以下步骤: 1. **创建Java类**:首先,我们需要定义与XML元素相对应的Java类。这些类会包含对应XML节点的属性。例如,如果XML文件有`<person>`标签,我们可以创建一个`Person`类,...
**JAXB(Java ...总之,JAXB是Java开发中处理XML数据的重要工具,它的安装和使用极大地提高了开发效率,使得XML数据的处理更加便捷。通过理解和熟练掌握JAXB,开发者可以更好地构建和维护XML相关的应用程序。
因此,在Java 9及更高版本中,如果项目需要使用JAXB,必须明确声明依赖。 `jaxb-api-2.3.0.jar`是JAXB的API接口定义,包含了用于创建和操作XML绑定的类和接口。这个API层不包含实际的实现,而是提供给应用调用的...
### JAXB使用场景 - 数据交换:在分布式系统中,服务间通信常通过XML格式的数据交换,JAXB提供了便捷的序列化和反序列化手段。 - 配置文件解析:XML常被用作应用程序的配置文件,JAXB能帮助解析和操作这些配置。 - ...
JAXB允许开发者将XML文档转换为可以直接在Java应用程序中使用的对象,同时也能够将Java对象转换为XML格式的数据。这在处理XML数据时极大地提高了效率和便利性。 `jaxb-api`和`jaxb-impl`是JAXB框架的核心组成部分。...
在使用这两个库文件时,通常需要同时包含`jaxb-api.jar`和`jaxb-impl.jar`,因为API库提供了接口定义,而实现库提供了具体的实现。有时候,为了完整支持JAXB功能,可能还需要其他相关库,如`activation.jar`...
2. **生成Java类**:如果已有XML Schema(XSD),可以使用JAXB的`xjc`工具自动生成符合Schema的Java类。 3. **绑定上下文(Context)**:创建`JAXBContext`对象,它是整个JAXB操作的核心,负责管理和维护Java类型与...
在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将XML文档和Java对象之间进行绑定的技术。在处理XML文件时,特别是涉及到...遵循这些原则,可以有效地避免在Java开发中使用JAXB时出现的乱码问题。
2. **实例化(Unmarshalling)**:当需要将XML数据转换为Java对象时,JAXB使用Unmarshaller接口解析XML文档,生成对应的Java对象。这个过程是将XML数据"反序列化"为可操作的Java对象。 3. **序列化(Marshalling)*...
使用JAXB,开发者首先需要定义Java类来表示XML结构,然后通过JAXB的`@XmlRootElement`和`@XmlElement`等注解来标注这些类,以便JAXB能够理解它们与XML元素的对应关系。接着,可以使用`JAXBContext`来创建一个上下文...