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

jaxb 的使用介绍[转载]

阅读更多
[size=medium]什么是jaxb?
http://java.sun.com/xml/jaxb/about.html

主要能干什么?
当人们需要用java应用程序来访问数据库的时候,jdbc诞生了
当人们觉得频繁的jdbc操作很繁琐的时候,o/r mapping诞生了
当人们需要用java操作xml的时候,sax, dom诞生了
当人们觉得用dom操作xml很繁琐的时候, jaxb诞生了
jaxb---将xml与java对象绑定的sun规范.

使用:
jaxb的bin目录下有一个xcj.bat的批处理文件, 作用就是根据xml scheme文件比如xsd来生成java文件
sample.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            jaxb:version="1.0" >
            <xsd:element name="registry" type="RegistryType"/>
            
            <xsd:complexType name="RegistryType">
                <xsd:sequence>
                    <xsd:element name="module" type="ModuleType"/>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:complexType name="ModuleType">
                <xsd:sequence>
                    <xsd:element name="serviceFactory" type="ServiceFactoryType"/>
                    <xsd:element name="serviceClientFactory" type="ServiceClientFactoryType"/>
                </xsd:sequence>
                <xsd:attribute name="name" type="xsd:string"/>
            </xsd:complexType>

            <xsd:complexType name="ServiceFactoryType">
                <xsd:sequence>
                    <xsd:element name="service" type="ServiceType" minOccurs="0" maxOccurs="unbounded"/>
                </xsd:sequence>
                <xsd:attribute name="class" type="xsd:string">
                    <xsd:annotation>
                        <xsd:appinfo>
                            <jaxb:property name="clazz"/>
                        </xsd:appinfo>
                    </xsd:annotation>
                </xsd:attribute>
            </xsd:complexType>

            <xsd:complexType name="ServiceType">
                <xsd:attribute name="id" type="xsd:string"/>
                <xsd:attribute name="class" type="xsd:string">
                    <xsd:annotation>
                        <xsd:appinfo>
                            <jaxb:property name="clazz"/>
                        </xsd:appinfo>
                    </xsd:annotation>
                </xsd:attribute>
            </xsd:complexType>

            <xsd:complexType name="ServiceClientFactoryType">
                <xsd:sequence>
                    <xsd:element name="serviceClient" type="ServiceClientType"/>
                </xsd:sequence>
                <xsd:attribute name="class" type="xsd:string">
                    <xsd:annotation>
                        <xsd:appinfo>
                            <jaxb:property name="clazz"/>
                        </xsd:appinfo>
                    </xsd:annotation>
                </xsd:attribute>
            </xsd:complexType>

            <xsd:complexType name="ServiceClientType">
                <xsd:sequence>
                    <xsd:element name="serviceRender" type="ServiceRenderType" minOccurs="0" maxOccurs="unbounded"/>
                </xsd:sequence>
                <xsd:attribute name="id" type="xsd:string"/>
                <xsd:attribute name="class" type="xsd:string">
                    <xsd:annotation>
                        <xsd:appinfo>
                            <jaxb:property name="clazz"/>
                        </xsd:appinfo>
                    </xsd:annotation>
                </xsd:attribute>
                <xsd:attribute name="renderFactory" type="xsd:string"/>
            </xsd:complexType>

            <xsd:complexType name="ServiceRenderType">
                <xsd:attribute name="class" type="xsd:string">
                    <xsd:annotation>
                        <xsd:appinfo>
                            <jaxb:property name="clazz"/>
                        </xsd:appinfo>
                    </xsd:annotation>
                </xsd:attribute>
                <xsd:attribute name="id" type="xsd:string"/>
            </xsd:complexType>
</xsd:schema>
在cmd窗口下   xjc -p com.hairroot.jaxb sample.xsd
这个命令会在com/hairroot/jaxb的目录下生成几个interface, 并在com/hairroot/jaxb/impl下面生成各自的实现类,实现类看起来还是很复杂的。为什么这么复杂,原因就是需要考虑很多的事情,比如进行marshal的时候,如果尽可能的将输出跟输入xml看起来一致的xml, 而不是元素,属性的顺序弄得乱七八糟的。

注意:除了生成的java文件之外,还有一个jaxb.properties, 和ser。这两个东西是不能 丢的,否则会报错。

unmarshall的操作:
两种方式
   
1)JAXBContext context = JAXBContext.newInstance("com.hairroot.jaxb");
          context.createUnmarshaller().unmarshal(new File("d:/hairroot/jaxb/sample.xml"));
    2)ObjectFactory factory = new ObjectFactory();
          factory.createUnmarshaller().unmarshal(new File("d:/hairroot/jaxb/sample.xml"));
    unmarshall返回的结果是一个object, 也就是根类型的一个实现类,可以强制转型了之后进行其它的操作。

marshall的操作:
同样有两种方式
   
1)JAXBContext context = JAXBContext.newInstance("com.hairroot.jaxb");
          Object root = context.createUnmarshaller().unmarshal(new File("d:/hairroot/jaxb/sample.xml"));
          context.createMarshaller().marshal(root, System.out);
    2)ObjectFactory factory = new ObjectFactory();
          Object root = factory.createUnmarshaller().unmarshal(new File("d:/hairroot/jaxb/sample.xml"));
          factory.createMarshaller().marshal(root, System.out);
Validation的操作现在略;

如何将xsd:data类型进行格式化的输出:
    如果在schema中定义一个xsd:date类型,那么jaxb会将其转化为java.util.Calendar的类型,然而这样有个问题,如果 sample.xml中数据为2005-03-09, 那么进行marshal的操作后生成的xml为2005-03-09+08:00, 解决方法, 在scheme中
                       
<xsd:element name="shipDate" minOccurs="0">
                            <xsd:simpleType>
                                <xsd:annotation>
                                    <xsd:appinfo>
                                        <jaxb:javaType name="java.sql.Date" printMethod="toString" parseMethod="valueOf"/>
                                    </xsd:appinfo>
                                </xsd:annotation>
                                <xsd:restriction base="xsd:date"/>
                            </xsd:simpleType>
                        </xsd:element>
并且还需要在xsd的namespace中加入
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            jaxb:version="1.0" >
这样再进行xjc的时候不会报错,而且输入的date也就符合习惯了,如果不用
<jaxb:javaType name="java.sql.Date" printMethod="toString" parseMethod="valueOf"/>
则需要自己来写一个实现类,详细参考jaxb reference

如何处理java的一些保留字:
如果一个attribute的名字叫做class, 那么xjc产生的java中就有一个getClass的方法, 这与java.lang.Object 的getClass()相冲突,解决方法:
              
 <xsd:attribute name="class" type="xsd:string">
                    <xsd:annotation>
                        <xsd:appinfo>
                            <jaxb:property name="clazz"/>
                        </xsd:appinfo>
                    </xsd:annotation>
                </xsd:attribute>
可以用<jaxb:property name="clazz"/>来指定xjc生成的java的方法为getClazz()

jaxb1.0的问题:
目前我发现的主要问题是, attribute的输入的顺序跟schema中定义的顺序不一致,网上看到sun的工程师认为这不是一个很重要的问题,而且还认为attribute的顺序没有办法控制,这种借口简直好笑,如果能够做得更好为什么不去做?
推荐解决方法:
在xjc生成了java文件了之后,去看一下impl下面的每一个类的serializeAttributes()方法,调整这个方法的对应的 attribute的处理的上下顺序,就可以控制输出的xml的attribute出现的先后顺序,如此简单的事情,sun的工程师竟然说没有办法控制,当忽悠变成了一种时尚...

原文见 http://hairroot.blogchina.com/hairroot/899157.html[/size]
分享到:
评论

相关推荐

    如何更好地jaxb使用

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

    JAXB使用及代码示例

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

    jaxb 使用实例

    4. **注解驱动的映射(Annotation-Based Mapping)**:JAXB允许使用Java注解来指定Java类与XML元素之间的对应关系,使得无需绑定文件就能完成映射。 ### JAXB使用步骤 1. **创建Java模型类**:定义要序列化的Java...

    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

    android上使用 jaxb所需要的包

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

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

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

    JAXB的安装包及插件

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

    JAXB的 eclipse插件

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

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

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

    idea 中用jaxb 读xml中数据

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

    jaxb-api jaxb-impl jar

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

    JAXB实例入门

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

    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的使用

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

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

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

    jaxb (XML操作)

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

    jaxb api jar

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

    JAXB乱码问题解决

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

Global site tag (gtag.js) - Google Analytics