读取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文件时,如果没有工具支持,手工写,还是比较困难。
简单用途的话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"));
- }
- }
分享到:
相关推荐
JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...
在Java世界中,JAXB(Java Architecture for XML Binding)是Java EE平台的一个标准组件,用于实现这种数据绑定。JAXB允许开发者在Java对象和XML之间进行无缝转换,无需编写大量的手动序列化和反序列化代码。 首先...
通过JAXB,我们可以在Java对象和XML之间进行无缝的数据绑定,大大简化了XML的处理工作。在Idea中使用JAXB,我们需要遵循以下步骤: 1. **创建Java类**:首先,我们需要定义与XML元素相对应的Java类。这些类会包含...
在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标准...
JAXB(Java Architecture for XML Binding)是Sun Microsystems(现已被Oracle收购)推出的一种Java XML绑定框架。它是Java EE标准的一部分,提供了一种机制来将Java对象与XML文档相互转换。使用JAXB,可以通过简单...
JAXB是Java平台的一个标准,它为XML到Java对象的绑定提供了一种自动的方式,使得XML数据能够在Java应用程序中轻松地进行序列化和反序列化。这个技术允许开发者在XML文档和Java对象之间进行无缝转换,极大地简化了...
在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(Java Architecture for XML Binding)** 是Java平台中用于XML到Java对象绑定的API,它是Java EE和Java SE标准的一部分,允许开发者在Java应用程序中方便地将XML数据转换为Java对象,反之亦然。这个过程极大...
3. **XML到Java对象的绑定**:通过JAXB,可以解析XML文档并创建相应的Java对象实例,这在处理XML输入数据时非常有用。 4. **源代码编辑器支持**:Eclipse的JAXB插件还提供了代码补全、错误检查和格式化等功能,使得...
3. **数据绑定**:JAXB通过自动生成的源代码或用户自定义的注解,实现了XML Schema与Java类之间的映射。这种数据绑定使得开发人员不必手动处理XML解析和生成的细节。 4. **API支持**:`jaxb-impl.jar`包含JAXB的...
在Web服务场景中,JAXB在JAX-WS(Java API for XML Web Services)规范中扮演着核心角色,用于处理数据绑定,使得Web服务的创建和消费更加灵活和可定制。 在Web服务的世界里,有三个关键组件:WSDL(Web Service ...
JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML数据之间进行映射的机制。JAXB允许开发者将XML文档转换为可以直接在Java应用程序中使用的对象,同时也能够将Java...
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` 是Java应用程序中用于XML绑定(Java Architecture for XML Binding,简称JAXB)的重要库文件。JAXB是Java SE和Java EE平台的标准部分,它提供了一种将XML文档与Java...
- **规范绑定模式**:说明了 JAXB 2.2.6 的规范绑定模式的位置,这对于理解 JAXB 如何进行 XML 数据绑定至关重要。 - **变更日志**:详细记录了 JAXB 2.2.6 与其前几个版本之间的变化,包括但不限于: - **2.2.5-2 ...
3. **数据绑定**:JAXB通过注解或绑定配置文件来定义XML元素和属性与Java类字段之间的映射关系,实现数据绑定。 4. **流式处理**:JAXB提供了`Unmarshaller`和`Marshaller`接口,分别用于将XML数据解码为Java对象和...