http://zyl.iteye.com/blog/33729

读取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文件时,如果没有工具支持,手工写,还是比较困难。

分享到:
几个有用的静态方面,用于审查代码(aspect ... | jaxb 简介
  • 2006-11-11 20:22:58
  • 浏览 32307
  • 评论(13)
  • 论坛回复 / 浏览 (13 / 26330)
  • 分类:企业架构
  • 相关推荐
评论
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的:)

Java代码  
  1. public class XStreamDateReader {
  2. InputStream in = XStreamDateReader.class.getResourceAsStream("data.xml");
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的:)

Java代码  
  1. public class Customer {
  2. protected Address address;
  3. protected String name;
  4. protected String id;
  5. public String toString(){
  6. return id+ " " + name + "@" + address;
  7. }
  8. }
  9. import java.math.BigInteger;
  10. public class Address {
  11. protected String street;
  12. protected String city;
  13. protected BigInteger zip;
  14. public String toString(){
  15. return city+ " " + street + " " + zip;
  16. }
  17. }
  18. import java.io.InputStream;
  19. import com.thoughtworks.xstream.XStream;
  20. public class XStreamDataReader {
  21. public static void main(String[] args) {
  22. XStream xstream = new XStream();
  23. xstream.alias("customer", Customer.class);
  24. xstream.alias("address", Address.class);
  25. xstream.useAttributeFor("id", String.class);
  26. InputStream in = XStreamDataReader.class.getResourceAsStream("data.xml");
  27. Customer bo = (Customer)xstream.fromXML(in);
  28. System.out.println(bo);
  29. xstream.toXML(bo,    new FileWriter("data1.xml"));//另存为...
  30. }
  31. }
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的强大相关推荐

  1. 查询优化器内核剖析第四篇:从一个实例看执行计划

    查询优化器内核剖析第四篇:从一个实例看执行计划 系列文章索引: 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计 ...

  2. 【FlexSim2019】自学笔记:一个实例看何为A连接?何为S连接?其意义的深入探讨

    A.S连接是仿真软件FlexSim 2019中常用的两种连接.那么,二者有什么区别?笔者在这篇文章里以实例,进行了讨论.了解二者意义,才能以不变应万变,具备独立处理问题的能力. 了解连接之前,先看看什 ...

  3. 从一个实例看编程水平的步步提高

    很久很久前就想写这个话题的文章了,但是,总是找不到合适的例子.例子简单不足于说明问题,例子复杂可读性就会降低,就会达不到文章的目的.两难总让人激发解决问题的斗志,于是乎自己试着写写这个例子吧.这个例子 ...

  4. 【C/C++】一个实例看 回调函数 / 函数指针 应用与原理

    前言:笔者在学习数据结构经典问题"四种方法求解最大子列和"时,遇到了一个需求:计时是重复动作,因此想创建一个可以为算法运行时间计时的函数.由于计时的特殊性(被计时的函数要被掐头又掐 ...

  5. 从一个实例看javascript几种常用格式的转换

    要对如图一所示的左侧table的数据按照"总量"进行排序 1,在前端实现 2,数据格式为object,如图二 原创文章,转载请注明:http://www.cnblogs.com/p ...

  6. 自动白平衡基本原理与应用实例看图说话(转载)

    原文地址:自动白平衡基本原理与应用实例看图说话(转载)作者:阿珠珠 柯纳: "从这个图可以看到场景识别系统就是把1005像素CCD获取的信息不仅提供给AE(自动测光)系统而且还提供给AF(自 ...

  7. java jaxb 集合_java.util.List是一个接口,JAXB不能处理接口

    java.util.List是一个接口,JAXB不能处理接口 尝试部署我的应用程序时,我似乎得到以下exception: Caused by: com.sun.xml.bind.v2.runtime. ...

  8. 如何聚焦自己的研究方向?一个实例研究

    如何聚焦自己的研究方向?一个实例研究 文章目录 如何聚焦自己的研究方向?一个实例研究 目标人群 主讲人介绍 平台 内容 Part I: 如何看到领域内文献的Overview? Part II: 如何专 ...

  9. php中访问控制_一个实例:基于RBAC理论的访问控制实践

    基于角色的访问控制(RBAC)是目前公认的解决大型企业的统一资源访问控制的有效方法.访问控制实际是复杂的,解决方式也是多样的.不用一味追求完善,在有限的资源内选择最合适自己的更重要. 基于角色的访问控 ...

最新文章

  1. 判断一个字符串的所有字符是否都在另一个字符串中
  2. 【推荐系统】推荐系统概述
  3. webpack常用命令总结
  4. 新版《谷歌搜索引擎优化初学者指南》
  5. 20200922:leetcode35周双周赛题解记录(下)
  6. TatukGIS - GisDefs - CheckFileWriteAccess 函数
  7. 如何保证战略落地_博雅视野丨大健康战略时代,全龄康养如何落地?
  8. 写一个用矩形法求定积分的通用函数,分别求sinx,cosx,expx从0到1的定积分(指针方法处理)——C语言
  9. 购买计算机键盘,键盘安装步骤是怎样的 怎样选购电脑键盘
  10. android学习日记——高级组件3(PopupWindow,Notifcation,Style,Theme,自定义组件)
  11. 花生壳 linux客户端 命令
  12. android qq分身,手机qq怎么分身
  13. 【js】JS数组复制或克隆新数组修改不影响原数组
  14. 2020年科协第一次硬件培训总结
  15. scrapy实践-02
  16. 基于51单片机LCD1602显示
  17. Python   pip安装selenium安装不了报错原因
  18. java基于ssm的电影院订票选座系统
  19. silabs 定时器PWM配置
  20. gopro7怎么回看视频_玩转手机短视频剪辑,学一个暑假就够了!

热门文章

  1. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1094:与7无关的数
  2. 【Qt】Visual Studio中无法打开Qt中UI文件
  3. 【Qt】Qt中QJsonArray类
  4. 【Linux】一步一步学Linux——dpkg-statoverride命令(277)
  5. h5封装去底部_干货分享 | 一步一步教你在SpringBoot中集成微信支付H5支付
  6. 【华科考研机试题】二叉树遍历(递归版 详细注释)
  7. Codeforces 988E. Divisibility by 25
  8. 1018 锤子剪刀布 (20 分)
  9. Failed to get response from /vue-cli-version-marker
  10. 网站服务器windows登陆密码忘记,网站服务器windows登陆密码忘记