`
zyl
  • 浏览: 486248 次
社区版块
存档分类
最新评论

从一个实例看jaxb的强大

阅读更多
   读取xml对于应用软件来说是一个必不可少的工作,当然现在的jdk也提供了很好的处理xml方式,读写xml的库也挺多,包括有名的dom4j,不管使用任何的代码库,对于xml只是一个解析工作而已,不能马上绑定到java 对象。对于对象,每次都需要set 或者get相应的属性,当然也可以使用map 来保存xml配置。
    于是,一种新的处理方式用于对象和xml之间的映射就变得非常需要,还好sun提供了jaxb,一种很方便的方式来处理java对象和xml内容。下面通过一个实例来体会一下。
    看一下如下的xml
<?xml version="1.0"?>
<customer id="No1">
    <name>Alice Smith</name>
    <address>
        <street>123 Maple Street</street>
        <city>Cambridge</city>
        <zip>12345</zip>
    </address>
</customer>

别忘了生成相应的xsd,或者dtd文件,这是主要的配置:
xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
    <xs:complexType name="Customer">
      <xs:sequence>
         <xs:element name="address" type="Address"/>
         <xs:element name="name" type="xs:string"/>
      </xs:sequence>
       <xs:attribute name="id" type="xs:string"/>      
    </xs:complexType>
  
      <xs:complexType name="Address">
      <xs:sequence>
         <xs:element name="street" type="xs:string"/>
         <xs:element name="city" type="xs:string"/>
         <xs:element name="zip" type="ZipCodeType"/>
       </xs:sequence>
   </xs:complexType>
 
    <xs:simpleType name="ZipCodeType">
      <xs:restriction base="xs:integer">
         <xs:minInclusive value="10000"/>
         <xs:maxInclusive value="99999"/>
      </xs:restriction>
    </xs:simpleType>
    <xs:element name="customer" type="Customer"/>
    <xs:element name="address" type="Address"/>
</xs:schema>


需要映射两个java对象,CustomerBo和AddressBo
java 对象可以通过xjc来生成。
或者自己定义(但需要增加相应的java注释,如@XmlAccessorType,@XmlType,这是给引擎使用的)
所以一般通过xjd自动生成


@XmlAccessorType(AccessType.FIELD)
@XmlType(name = "Customer", propOrder = {
    "address",
    "customerName"
})
public class CustomerBo {

    protected Address address;

    @XmlElement(name = "name")
    protected String customerName;

    @XmlAttribute
    protected String id;

    public Address getAddress() {
        return address;
    }

    public String getCustomerName() {
        return customerName;
    }

    public String getId() {
        return id;
    }

    public void setAddress(Address value) {
        this.address = value;
    }

    public void setCustomerName(String value) {
        this.customerName = value;
    }

    public void setId(String value) {
        this.id = value;
    }
}


public class Address {

    protected String street;

    protected String city;

    @XmlElement(name = "zip")
    protected BigInteger zipCode;

    public String getStreet() {
        return street;
    }

    public void setStreet(String value) {
        this.street = value;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String value) {
        this.city = value;
    }

    public BigInteger getZipCode() {
        return zipCode;
    }

    public void setZipCode(BigInteger value) {
        this.zipCode = value;
    }

}

定义jxb绑定文件:
<jxb:bindings version="1.0"
               xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <jxb:bindings schemaLocation="customer.xsd" node="/xs:schema">  
         
   <jxb:globalBindings
         fixedAttributeAsConstantProperty="false"
         collectionType="java.util.Vector"
         typesafeEnumBase="xs:NCName"
         choiceContentProperty="false"
         typesafeEnumMemberName="generateError"
         enableFailFastCheck="false" 
         generateIsSetMethod="false"
         underscoreBinding="asCharInWord"/>
   <jxb:schemaBindings>
      <jxb:package name="mycompany.demo">
        <jxb:javadoc><![CDATA[<body>Package level documentation for generated package mycompany.demo.</body>]]>
        </jxb:javadoc>
      </jxb:package>
      <jxb:nameXmlTransform>
        <jxb:elementName suffix="Element"/>
      </jxb:nameXmlTransform>
    </jxb:schemaBindings> 

    //需要绑定的元素
   <jxb:bindings node="//xs:complexType[@name='Customer']">
       //绑定的类
      <jxb:class name="CustomerBo">
        <jxb:javadoc>A &lt;b>todo..</jxb:javadoc>
      </jxb:class>
      <jxb:bindings node=".//xs:element[@name='name']">
           //绑定的属性
           <jxb:property name="customerName"/>
        </jxb:bindings>
    </jxb:bindings> 
        
    <jxb:bindings node="//xs:complexType[@name='Address']">
      <jxb:class name="AddressBo">
        <jxb:javadoc><![CDATA[First line of documentation for a <b>Address</b>.]]></jxb:javadoc>
      </jxb:class>
      <jxb:bindings node=".//xs:element[@name='zip']">
         <jxb:property name="zipCode"/>
      </jxb:bindings>
    </jxb:bindings>
           
   </jxb:bindings>
</jxb:bindings>

    看着比较复杂,其实挺好理解,当然可以不需要这个绑定文件,也可以绑定相应的java 类,但需要元素名称和类名称完全一致,而且属性也要一致。

    看一下jaxb是如何来读入xml的:
        //主要的环境类,主要读取ObjectFactory这个类,这是由xjc生成的。
        JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
        Unmarshaller u = jc.createUnmarshaller();
        JAXBElement customerE = (JAXBElement) u.unmarshal(new FileInputStream(
                                "customer.xml"));
        CustomerBo bo = (CustomerBo) customerE.getValue();
    就是这么简单

    写入也比较简单:
        JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
        Marshaller marshaller=jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        customerE.setValue(bo);
        marshaller.marshal( customerE,new FileOutputStream("test.xml"));
 
    在webservices中jaxb的作用是明显的,当然也有不方便的地方,比如定义binding.jaxb文件时,如果没有工具支持,手工写,还是比较困难。
分享到:
评论
14 楼 lizhenlzlz 2018-01-07  
对我有用,看过
13 楼 pancras 2007-04-10  
请问需要映射的两个java对象是怎么确定的?是自己写的,还是工具生成的?生成几个依据是什么?挺感兴趣的。比较有意思?能有在深入点的例子吗?感谢楼主分享!
还有,你那个头像挺逗的!
12 楼 glchengang 2006-12-01  
用过jaxb,不过当时发现它不支持有继承结构的类的绑定,于是弃用了。
也许是自己对它了解不深吧。
11 楼 ryan 2006-11-17  
引用
或者自己定义(但需要增加相应的java注释,如@XmlAccessorType,@XmlType,这是给引擎使用的)


这里的@XmlAccessorType,@XmlType 似乎只是for "Java-toSchema" ,用J2SE5.0中的元数据注释(Annotation)。

以前用过JAXB1.0,通过xjc会生成许多的Impl代码。但是今天使用了JDK5.0和JAXB2.0,发现一张xsd只是生成了一个ObjectFactory.java和xml schema中的root两个对象。十分诧异!难道2.0不需要那些自动生成的Impl代码了么?

请各位大师指点!
10 楼 zyl 2006-11-15  
guoshiguan 写道
看了楼主的文章,受益了, 不过还是有两个问题
-------------------------------
需要映射两个java对象,CustomerBo和AddressBo
java 对象可以通过xjc来生成。
或者自己定义(但需要增加相应的java注释,如@XmlAccessorType,@XmlType,这是给引擎使用的)
所以一般通过xjd自动生成

一个java对像要用两种工具生成吗,是什么工具,能不能告诉我全名啊,。

---------------------------------------
别忘了生成相应的xsd,或者dtd文件,
这个东东要用什么东东成生,

---------------------------------------
JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
mycompany.demo是什么东东


不要意思打错了,是jaxb 自带的xjc命令,也支持ant task。根据schema生成相应的java源代码
xsd,可以通过jaxb的schemagen来生成

mycompany.demo 表示package 名称
9 楼 zyl 2006-11-15  
想不到有那么多人关注,我只是在学习jaxb当中,有几点需要说明一下:
  
   jaxb,不只是一个单纯的工具库,感觉功能比较强大,需要和其他的jaxp相互协作。
   jaxb关注的方面更广,能处理更为复杂的xml,

看一下以下代码就可以知道:
   代码1,处理xpath
   JAXBXpath jaxbXpath = new JAXBXpath(doc, binder);
   (USAddress) jaxbXpath.evaluate("/purchaseOrder/shipTo");
 
   代码2,直接更新xml
   Binder<Node> binder=JAXBContext.createBinder()
   JAXBElement<Items.Item> itemE = binder.unmarshal(
                    node,
                    Items.Item.class);
   binder.Items.Item item = itemE.getValue();
   item.setComment("qualifies for free shipping");
    binder.updateXML(item);

当然为了处理复杂的xml,其复杂的配置也是不可少的。

xstream 我也了解过,不过大多数情况下我只是用来作为java Serializable 而使用。
对于处理一些比较简单的xml,xstream 是比较方便。

感觉两者的目的不太一致。有兴趣的可以去看看sun的jwsdp带的相关例子


8 楼 pig345 2006-11-14  
不好意思,我这里FCKeditor出错,连发了2次
7 楼 pig345 2006-11-14  
以前自己写,后来用过apache的betwixt,感觉比这里说的jaxb简单的多。
6 楼 pig345 2006-11-14  
以前自己写,后来用过apache的betwixt,感觉比这里说的jaxb简单的多。
5 楼 lordhong 2006-11-14  
xmx0632 写道
贴个xstream的:)
public class XStreamDateReader {
InputStream in = XStreamDateReader.class.getResourceAsStream("data.xml");

大哥,你手真快!。。。上面的DateReader应该是DataReader吧
4 楼 guoshiguan 2006-11-14  
看了楼主的文章,受益了, 不过还是有两个问题
-------------------------------
需要映射两个java对象,CustomerBo和AddressBo
java 对象可以通过xjc来生成。
或者自己定义(但需要增加相应的java注释,如@XmlAccessorType,@XmlType,这是给引擎使用的)
所以一般通过xjd自动生成

一个java对像要用两种工具生成吗,是什么工具,能不能告诉我全名啊,。

---------------------------------------
别忘了生成相应的xsd,或者dtd文件,
这个东东要用什么东东成生,

---------------------------------------
JAXBContext jc = JAXBContext.newInstance("mycompany.demo");
mycompany.demo是什么东东
3 楼 zhangqidi 2006-11-14  
一直用JiBX,觉得很好用,只要xml文件配置一下就ok了

2 楼 xmx0632 2006-11-13  
贴个xstream的:)
public class Customer {

	protected Address address;

	protected String name;

	protected String id;
	
	public String toString(){
		return id+ " " + name + "@" + address;
	}
}

import java.math.BigInteger;

public class Address {

	protected String street;

	protected String city;

	protected BigInteger zip;

	public String toString(){
		return city+ " " + street + " " + zip;
	}
}


import java.io.InputStream;

import com.thoughtworks.xstream.XStream;

public class XStreamDataReader {

        public static void main(String[] args) {
   	
            XStream xstream = new XStream();
            xstream.alias("customer", Customer.class);
            xstream.alias("address", Address.class);
            
            xstream.useAttributeFor("id", String.class);
            
            InputStream in = XStreamDataReader.class.getResourceAsStream("data.xml");
            Customer bo = (Customer)xstream.fromXML(in);
            
			System.out.println(bo);

            xstream.toXML(bo,    new FileWriter("data1.xml"));//另存为...
        }
}
1 楼 lordhong 2006-11-13  
看起来好麻烦啊!简单用途的话XStream就可以了

相关推荐

    JAXB与xml相互转换实例

    Java Architecture for XML Binding(JAXB)是Java平台上的一个标准技术,它允许开发者在XML文档和Java对象之间进行无缝转换。这项技术的核心理念是通过自动的编译过程,将XML Schema(XSD)定义的数据结构映射为...

    jaxb2 生产java类demo实例

    本教程将通过一个实际的demo实例来详细讲解如何使用JAXB2来生产Java类。 **1. JAXB2概述** JAXB2是Java SE 6及更高版本的标准组件,它允许开发者在不编写大量手动代码的情况下,将XML文档映射到Java对象,反之亦然...

    用JAXB生成一个XML

    本文将详细介绍如何利用JAXB来从一个XML模式(Schema)生成Java类,并最终构建出符合该模式的XML文档。 #### 二、准备工作 为了使用JAXB从XML模式中生成Java类,首先需要确保以下工具和库已经正确配置: 1. **...

    JAXB实例入门

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

    JAXB的 eclipse插件

    JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML文档之间进行映射的机制。Eclipse作为一款强大的Java集成开发环境,为开发者提供了丰富的插件支持,其中包括JAXB的...

    jaxb生成XML例子

    JAXB (Java Architecture for XML Binding) 是 Java 中用于对象到XML以及XML到对象转换的API。它使得开发者能够轻松地将Java对象模型映射到...在实际开发中,JAXB是一个强大的工具,尤其在处理数据交换和序列化场景中。

    jaxb 使用实例

    总结来说,JAXB是一个强大的工具,它简化了Java与XML之间的交互,让开发者能够专注于业务逻辑,而不是数据转换的细节。通过掌握JAXB,你可以更高效地处理XML相关的任务,无论是数据交换还是配置文件管理。

    java学习之jaxb的学习一

    JAXB是Java平台的一个标准,它为XML到Java对象的绑定提供了一种自动的方式,使得XML数据能够在Java应用程序中轻松地进行序列化和反序列化。这个技术允许开发者在XML文档和Java对象之间进行无缝转换,极大地简化了...

    idea 中用jaxb 读xml中数据

    当我们需要处理XML文件,比如从XML中提取数据时,JAXB(Java Architecture for XML Binding)是一个强大的工具。本教程将详细解释如何在Idea中利用JAXB来读取XML文件中的数据。 JAXB是Java标准API,它提供了将Java...

    jaxb (XML操作)

    2. **设置上下文(Context)**:使用`JAXBContext`类创建一个JAXB上下文,它包含了所有需要被转换的Java类的信息。 3. **反序列化(Unmarshalling)**:使用`Unmarshaller.unmarshal()`方法将XML数据转换为Java对象...

    webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包

    然后,**JAXB** 是一个核心的Java技术,用于将XML文档和Java对象之间的映射自动化。它允许我们通过注解或者XML绑定配置文件来定义Java类和XML元素之间的关系。在Web服务中,JAXB通常用于序列化和反序列化Java对象到...

    Jaxb webservice java调用

    Java中的JAXB(Java Architecture for XML Binding)是一个用于在Java对象和XML之间进行绑定的工具,使得我们可以方便地在XML文档和Java对象之间进行转换。它简化了Web服务的开发,尤其是在处理XML数据时。本篇文章...

    jaxb XMl和BEAN互转实例(内含jar包)

    在给定的"jaxb XMl和BEAN互转实例(内含jar包)"中,我们有一个实用工具类,它简化了使用JAXB进行XML与BEAN对象之间转换的过程。 在Java编程中,BEAN通常指的是符合JavaBeans规范的简单Java类,它们通常包含getter...

    JAXB 利用xsd文件生成java类

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

    JAXB的例子

    Java Architecture for XML Binding (JAXB) 是Java平台上的一个重要标准,它提供了一种机制,能够将XML文档与Java对象之间进行映射,实现XML数据和Java对象的无缝转换。JAXB允许开发者在Java应用中方便地处理XML数据...

    jaxb-impl.jar包

    `jaxb-impl.jar`是Java Architecture for XML Binding (JAXB)的一个实现包,它是Java平台标准版(Java SE)和企业版(Java EE)的一部分,主要用于XML到Java对象的绑定以及反之,使得开发者能够方便地在Java程序中...

    JAXB应用实例.zip_36ZP_gainrtu_java

    在"JAXB应用实例.doc"中,可能包含了具体的代码示例,演示如何定义一个简单的Java类,添加必要的JAXB注解,然后展示如何使用Unmarshaller和Marshaller进行XML的转换。这个文档会详细解释每个步骤,对于初学者来说是...

    JAXB的HelloWorld源码

    **JAXB(Java Architecture for XML Binding)** 是Java平台上的一个标准技术,用于将Java对象绑定到XML(eXtensible Markup Language)文档,以及从XML数据还原为Java对象。它是Java SE和Java EE的一部分,提供了方便...

    JAXB工具

    通过`JAXBContext.newInstance(Product.class)`创建一个JAXB上下文,然后使用`Marshaller`实例将对象序列化到XML文件中。后者演示了如何从XML文件反序列化回Java对象,这通过`unmarshal()`方法完成,该方法接收一个...

    JAXB使用及代码示例

    Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得开发者能够方便地在Java对象和XML文档之间进行数据绑定,从而简化了XML处理的工作。JAXB允许我们将Java...

Global site tag (gtag.js) - Google Analytics