读取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 <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文件时,如果没有工具支持,手工写,还是比较困难。
分享到:
相关推荐
Java Architecture for XML Binding(JAXB)是Java平台上的一个标准技术,它允许开发者在XML文档和Java对象之间进行无缝转换。这项技术的核心理念是通过自动的编译过程,将XML Schema(XSD)定义的数据结构映射为...
本教程将通过一个实际的demo实例来详细讲解如何使用JAXB2来生产Java类。 **1. JAXB2概述** JAXB2是Java SE 6及更高版本的标准组件,它允许开发者在不编写大量手动代码的情况下,将XML文档映射到Java对象,反之亦然...
本文将详细介绍如何利用JAXB来从一个XML模式(Schema)生成Java类,并最终构建出符合该模式的XML文档。 #### 二、准备工作 为了使用JAXB从XML模式中生成Java类,首先需要确保以下工具和库已经正确配置: 1. **...
在本文中,我们将探讨JAXB的基本概念、使用场景以及如何通过一个简单的实例来入门。 ### JAXB的核心功能 1. **对象到XML的序列化**:JAXB能够将Java对象转换为XML文档,使得Java应用程序能够方便地生成XML输出。 2...
JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML文档之间进行映射的机制。Eclipse作为一款强大的Java集成开发环境,为开发者提供了丰富的插件支持,其中包括JAXB的...
JAXB (Java Architecture for XML Binding) 是 Java 中用于对象到XML以及XML到对象转换的API。它使得开发者能够轻松地将Java对象模型映射到...在实际开发中,JAXB是一个强大的工具,尤其在处理数据交换和序列化场景中。
总结来说,JAXB是一个强大的工具,它简化了Java与XML之间的交互,让开发者能够专注于业务逻辑,而不是数据转换的细节。通过掌握JAXB,你可以更高效地处理XML相关的任务,无论是数据交换还是配置文件管理。
JAXB是Java平台的一个标准,它为XML到Java对象的绑定提供了一种自动的方式,使得XML数据能够在Java应用程序中轻松地进行序列化和反序列化。这个技术允许开发者在XML文档和Java对象之间进行无缝转换,极大地简化了...
当我们需要处理XML文件,比如从XML中提取数据时,JAXB(Java Architecture for XML Binding)是一个强大的工具。本教程将详细解释如何在Idea中利用JAXB来读取XML文件中的数据。 JAXB是Java标准API,它提供了将Java...
2. **设置上下文(Context)**:使用`JAXBContext`类创建一个JAXB上下文,它包含了所有需要被转换的Java类的信息。 3. **反序列化(Unmarshalling)**:使用`Unmarshaller.unmarshal()`方法将XML数据转换为Java对象...
然后,**JAXB** 是一个核心的Java技术,用于将XML文档和Java对象之间的映射自动化。它允许我们通过注解或者XML绑定配置文件来定义Java类和XML元素之间的关系。在Web服务中,JAXB通常用于序列化和反序列化Java对象到...
Java中的JAXB(Java Architecture for XML Binding)是一个用于在Java对象和XML之间进行绑定的工具,使得我们可以方便地在XML文档和Java对象之间进行转换。它简化了Web服务的开发,尤其是在处理XML数据时。本篇文章...
在给定的"jaxb XMl和BEAN互转实例(内含jar包)"中,我们有一个实用工具类,它简化了使用JAXB进行XML与BEAN对象之间转换的过程。 在Java编程中,BEAN通常指的是符合JavaBeans规范的简单Java类,它们通常包含getter...
JAXB (Java Architecture for XML Binding) 是Java平台上的一个标准,用于将XML文档与Java对象之间进行绑定,...在JAXB-Sunshine7这个示例中,可能包含了一个或多个关于如何使用JAXB从XSD生成Java类的演示和实践案例。
Java Architecture for XML Binding (JAXB) 是Java平台上的一个重要标准,它提供了一种机制,能够将XML文档与Java对象之间进行映射,实现XML数据和Java对象的无缝转换。JAXB允许开发者在Java应用中方便地处理XML数据...
`jaxb-impl.jar`是Java Architecture for XML Binding (JAXB)的一个实现包,它是Java平台标准版(Java SE)和企业版(Java EE)的一部分,主要用于XML到Java对象的绑定以及反之,使得开发者能够方便地在Java程序中...
在"JAXB应用实例.doc"中,可能包含了具体的代码示例,演示如何定义一个简单的Java类,添加必要的JAXB注解,然后展示如何使用Unmarshaller和Marshaller进行XML的转换。这个文档会详细解释每个步骤,对于初学者来说是...
**JAXB(Java Architecture for XML Binding)** 是Java平台上的一个标准技术,用于将Java对象绑定到XML(eXtensible Markup Language)文档,以及从XML数据还原为Java对象。它是Java SE和Java EE的一部分,提供了方便...
通过`JAXBContext.newInstance(Product.class)`创建一个JAXB上下文,然后使用`Marshaller`实例将对象序列化到XML文件中。后者演示了如何从XML文件反序列化回Java对象,这通过`unmarshal()`方法完成,该方法接收一个...
Java Architecture for XML Binding (JAXB) 是Java平台中用于处理XML和Java对象之间转换的一个标准API。它使得开发者能够方便地在Java对象和XML文档之间进行数据绑定,从而简化了XML处理的工作。JAXB允许我们将Java...