`

数据绑定之JAXB

    博客分类:
  • xml
阅读更多

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

 

简单用途的话XStream就可以了

 

Java代码 复制代码
  1. public class Customer {   
  2.   
  3.     protected Address address;   
  4.   
  5.     protected String name;   
  6.   
  7.     protected String id;   
  8.        
  9.     public String toString(){   
  10.         return id+ " " + name + "@" + address;   
  11.     }   
  12. }   
  13.   
  14. import java.math.BigInteger;   
  15.   
  16. public class Address {   
  17.   
  18.     protected String street;   
  19.   
  20.     protected String city;   
  21.   
  22.     protected BigInteger zip;   
  23.   
  24.     public String toString(){   
  25.         return city+ " " + street + " " + zip;   
  26.     }   
  27. }   
  28.   
  29.   
  30. import java.io.InputStream;   
  31.   
  32. import com.thoughtworks.xstream.XStream;   
  33.   
  34. public class XStreamDataReader {   
  35.   
  36.         public static void main(String[] args) {   
  37.        
  38.             XStream xstream = new XStream();   
  39.             xstream.alias("customer", Customer.class);   
  40.             xstream.alias("address", Address.class);   
  41.                
  42.             xstream.useAttributeFor("id", String.class);   
  43.                
  44.             InputStream in = XStreamDataReader.class.getResourceAsStream("data.xml");   
  45.             Customer bo = (Customer)xstream.fromXML(in);   
  46.                
  47.             System.out.println(bo);   
  48.   
  49.             xstream.toXML(bo,    new FileWriter("data1.xml"));//另存为...   
  50.         }   
  51. }  

 

 

分享到:
评论

相关推荐

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

    JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...

    Java与XML数据绑定

    在Java世界中,JAXB(Java Architecture for XML Binding)是Java EE平台的一个标准组件,用于实现这种数据绑定。JAXB允许开发者在Java对象和XML之间进行无缝转换,无需编写大量的手动序列化和反序列化代码。 首先...

    idea 中用jaxb 读xml中数据

    通过JAXB,我们可以在Java对象和XML之间进行无缝的数据绑定,大大简化了XML的处理工作。在Idea中使用JAXB,我们需要遵循以下步骤: 1. **创建Java类**:首先,我们需要定义与XML元素相对应的Java类。这些类会包含...

    JAVA和XML数据绑定 经典PDF

    在Java中,有多种方式实现XML数据绑定,包括JAXB(Java Architecture for XML Binding)、DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等。 1. JAXB:JAXB是Java标准...

    Java XML绑定技术 (Castor JAXB XMLBeans)

    JAXB(Java Architecture for XML Binding)是Sun Microsystems(现已被Oracle收购)推出的一种Java XML绑定框架。它是Java EE标准的一部分,提供了一种机制来将Java对象与XML文档相互转换。使用JAXB,可以通过简单...

    java学习之jaxb的学习一

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

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

    在Java开发环境中,`javax.rar`这一提及实际上与RAR压缩库无关,而是涉及到Java的XML绑定(JAXB)技术。标题中的"jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0"是JAXB的不同组件版本号,它们在处理XML到Java...

    JAXB的安装包及插件

    **JAXB(Java Architecture for XML Binding)** 是Java平台中用于XML到Java对象绑定的API,它是Java EE和Java SE标准的一部分,允许开发者在Java应用程序中方便地将XML数据转换为Java对象,反之亦然。这个过程极大...

    JAXB的 eclipse插件

    3. **XML到Java对象的绑定**:通过JAXB,可以解析XML文档并创建相应的Java对象实例,这在处理XML输入数据时非常有用。 4. **源代码编辑器支持**:Eclipse的JAXB插件还提供了代码补全、错误检查和格式化等功能,使得...

    jaxb-impl.jar包

    3. **数据绑定**:JAXB通过自动生成的源代码或用户自定义的注解,实现了XML Schema与Java类之间的映射。这种数据绑定使得开发人员不必手动处理XML解析和生成的细节。 4. **API支持**:`jaxb-impl.jar`包含JAXB的...

    如何使用JAXB框架定制Web服务行为.doc

    在Web服务场景中,JAXB在JAX-WS(Java API for XML Web Services)规范中扮演着核心角色,用于处理数据绑定,使得Web服务的创建和消费更加灵活和可定制。 在Web服务的世界里,有三个关键组件:WSDL(Web Service ...

    jaxb-api jaxb-impl jar

    JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML数据之间进行映射的机制。JAXB允许开发者将XML文档转换为可以直接在Java应用程序中使用的对象,同时也能够将Java...

    jaxb api jar

    Java Architecture for XML Binding (JAXB) 是Java平台中用于XML数据绑定的标准API,它使得Java对象和XML文档之间可以进行无缝转换。`jaxb-api-2.1.9.jar` 是一个包含JAXB API的库文件,版本为2.1.9,用于支持开发...

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

    `jaxb-api-2.1.jar` 和 `jaxb-impl-2.1.8.jar` 是Java应用程序中用于XML绑定(Java Architecture for XML Binding,简称JAXB)的重要库文件。JAXB是Java SE和Java EE平台的标准部分,它提供了一种将XML文档与Java...

    JAXB-2.2.6-release-documentation

    - **规范绑定模式**:说明了 JAXB 2.2.6 的规范绑定模式的位置,这对于理解 JAXB 如何进行 XML 数据绑定至关重要。 - **变更日志**:详细记录了 JAXB 2.2.6 与其前几个版本之间的变化,包括但不限于: - **2.2.5-2 ...

    JAXB的例子

    3. **数据绑定**:JAXB通过注解或绑定配置文件来定义XML元素和属性与Java类字段之间的映射关系,实现数据绑定。 4. **流式处理**:JAXB提供了`Unmarshaller`和`Marshaller`接口,分别用于将XML数据解码为Java对象和...

Global site tag (gtag.js) - Google Analytics