`

JAXB开发的技巧

阅读更多
   大家经常都会遇到xml格式文档的开发,对于解析XML和封装XML格式,我们自然而然的会想到JAXB,JAXB允许以XML格式存储和读取数据,而不需要程序的类结构实现特定的读取XML和保存XML的代码。
以下是需要输出的XML文本格式
<Books>
  <Book>
    <name>书名A</name>
    <author>作者A</author>
    <price>作者A</price>
  </Book>
  <Book>
    <name>书名B</name>
    <author>作者B</author>
    <price>作者B</price>
  </Book>
</Books>

首先我们需要使用XML Schema来描述XML格式,怎样自动生成xsd,我们可以通过trang.jar这个包来生成
java -jar trang.jar a.xml a.xsd

生成的XSD文件格式如下
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Book"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Book">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="author"/>
        <xs:element ref="price"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="name" type="xs:NCName"/>
  <xs:element name="author" type="xs:NCName"/>
  <xs:element name="price" type="xs:NCName"/>
</xs:schema>

现在可以使用jdk自带的xjc命令来生成代码了,xjc的具体使用方面就不多说,大家可以自己看看它的帮助文档
$ xjc a.xsd
parsing a schema...
compiling a schema...
generated\Book.java
generated\Books.java
generated\ObjectFactory.java


package generated;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{}Book" maxOccurs="unbounded"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "book"
})
@XmlRootElement(name = "Books")
public class Books {

    @XmlElement(name = "Book", required = true)
    protected List<Book> book;

    /**
     * Gets the value of the book property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the book property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getBook().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link Book }
     * 
     * 
     */
    public List<Book> getBook() {
        if (book == null) {
            book = new ArrayList<Book>();
        }
        return this.book;
    }

}


package generated;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{}name"/>
 *         &lt;element ref="{}author"/>
 *         &lt;element ref="{}price"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "name",
    "author",
    "price"
})
@XmlRootElement(name = "Book")
public class Book {

    @XmlElement(required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "NCName")
    protected String name;
    @XmlElement(required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "NCName")
    protected String author;
    @XmlElement(required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "NCName")
    protected String price;

    /**
     * Gets the value of the name property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getName() {
        return name;
    }

    /**
     * Sets the value of the name property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setName(String value) {
        this.name = value;
    }

    /**
     * Gets the value of the author property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAuthor() {
        return author;
    }

    /**
     * Sets the value of the author property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAuthor(String value) {
        this.author = value;
    }

    /**
     * Gets the value of the price property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getPrice() {
        return price;
    }

    /**
     * Sets the value of the price property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setPrice(String value) {
        this.price = value;
    }

}


package generated;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.namespace.QName;


/**
 * This object contains factory methods for each 
 * Java content interface and Java element interface 
 * generated in the generated package. 
 * <p>An ObjectFactory allows you to programatically 
 * construct new instances of the Java representation 
 * for XML content. The Java representation of XML 
 * content can consist of schema derived interfaces 
 * and classes representing the binding of schema 
 * type definitions, element declarations and model 
 * groups.  Factory methods for each of these are 
 * provided in this class.
 * 
 */
@XmlRegistry
public class ObjectFactory {

    private final static QName _Author_QNAME = new QName("", "author");
    private final static QName _Price_QNAME = new QName("", "price");
    private final static QName _Name_QNAME = new QName("", "name");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: generated
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link Book }
     * 
     */
    public Book createBook() {
        return new Book();
    }

    /**
     * Create an instance of {@link Books }
     * 
     */
    public Books createBooks() {
        return new Books();
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "author")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    public JAXBElement<String> createAuthor(String value) {
        return new JAXBElement<String>(_Author_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "price")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    public JAXBElement<String> createPrice(String value) {
        return new JAXBElement<String>(_Price_QNAME, String.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "name")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    public JAXBElement<String> createName(String value) {
        return new JAXBElement<String>(_Name_QNAME, String.class, null, value);
    }

}

下面我们就可以开始来写代码了
package generated;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import javax.xml.bind.JAXB;

public class Test {

	public static void main(String[] args) throws FileNotFoundException {
		marshal(new FileOutputStream("out.xml"));

		unmarshal(new FileReader("out.xml"));
	}

	private static void unmarshal(FileReader reader) {
		try {
			Books books = JAXB.unmarshal(reader, Books.class);
			System.out.println(books.getBook().size());
			System.out.println(books.getBook().get(0).getName());
			System.out.println(books.getBook().get(0).getAuthor());
			System.out.println(books.getBook().get(0).getPrice());
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
			}
		}
	}

	private static void marshal(OutputStream output) {
		ObjectFactory factory = new ObjectFactory();

		Books books = factory.createBooks();

		List<Book> bookList = books.getBook();

		Book book = factory.createBook();
		book.setName("书名A");
		book.setAuthor("作者A");
		book.setPrice("价格A");
		bookList.add(book);

		book = factory.createBook();
		book.setName("书名B");
		book.setAuthor("作者B");
		book.setPrice("价格B");
		bookList.add(book);

		book = factory.createBook();
		book.setName("书名C");
		book.setAuthor("作者C");
		book.setPrice("价格C");
		bookList.add(book);

		try {
			JAXB.marshal(books, output);
		} finally {
			try {
				output.close();
			} catch (IOException e) {
			}
		}
	}

}
分享到:
评论

相关推荐

    JAXB-2.2.6-release-documentation

    ### 知识点一:JAXB (Java Architecture for XML Binding) 概述 - **定义**:JAXB 是 Java 平台...通过阅读官方文档,开发者可以深入理解 JAXB 的工作原理,并掌握其高级使用技巧,从而提高开发效率和应用程序的质量。

    JSP应用开发详解第二版(16-17章)源码

    《JSP应用开发详解第二版》是一本深入探讨JSP技术的专业书籍,涵盖了JSP的高级应用和实际开发技巧。本书的第16章至17章主要关注JSP的实用性和扩展性,通过源码分析,我们可以深入了解JSP如何与其他技术如Java ...

    Web service开发指南

    XFire支持多种协议和数据格式,包括RESTful服务、JAXB数据绑定以及MTOM(消息传输优化机制)。其API简洁易用,使得开发Web服务更为高效。 ### 4. CXF框架 Apache CXF是目前最广泛使用的Java Web服务框架,结合了...

    Docx4j中文版开发手册

    总之,Docx4j中文版开发手册是一份全面的资源,涵盖了从基础操作到高级特性的所有方面,帮助开发者熟练掌握利用Java处理OpenXML文档的各种技巧和方法。对于需要在Java项目中处理Word文档的开发者来说,这是一份不可...

    java开发实战1200例

    在这个系列的第19至30章中,我们可以预见到一系列丰富的Java开发知识和技巧。下面将详细解析这些章节可能涵盖的关键知识点。 1. **异常处理** (Chapter 19): 异常处理是Java程序设计中的重要部分,用于处理运行时...

    a road map through nachos

    ### Nachos系统概览 #### 一、Introduction to Nachos(Nachos简介) Nachos是一款教育软件,旨在帮助学生深入理解和实践操作系统的核心概念和技术。...这对于学习操作系统原理和开发技能都具有重要意义。

    基于SoftEngine开发 WebService应用

    ### 基于SoftEngine开发 WebService应用 #### 概述 本文旨在为SoftEngine的开发者提供一套...通过阅读本文,开发者能够更好地理解和掌握基于SoftEngine进行WebService开发的方法和技巧,从而有效提升开发效率和质量。

    Axis1.4 开发指南_V1.0

    10. **最佳实践**:提供关于使用Axis1.4进行Web服务开发的建议和技巧,以提高开发效率和服务的可靠性。 总的来说,《Axis1.4 开发指南》是Java开发者学习和掌握Web服务开发的宝贵资源,通过深入阅读和实践,开发者...

    java开发环境jre 源码包

    1. `javax`:这个目录包含了一系列的Java扩展类库,如JavaBeans、Java Activation Framework (JAF) 和Java XML Binding (JAXB)等。这些类库提供了用于构建企业级应用和服务的功能。 2. `com`:这个目录通常包含了...

    在android中使用XML的技巧

    - **Java XML Binding API(JAXB)**:由于其重量级特性,JAXB在Android中并不适用,但开发者可以通过其他轻量级库,如Vogella推荐的SimpleXML库,实现类似的功能,将XML映射为Java对象。 2. **Android新闻阅读器...

    用XFire开发Webservice简单实例

    3. **扩展性**:支持多种协议和标准,如JAXB、MTOM、WS-Security等,可满足复杂的业务需求。 **五、源码与工具** 在这个实例中,`MyEclipse下XFire开发Webservice实例.doc`文件应该包含了详细的步骤说明和源码示例...

    webservice cxf 开发实战

    4. **数据绑定**:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding),用于自动将XML数据转换为Java对象。 5. **安全集成**:CXF集成了多种安全机制,如WS-Security、OAuth等,可以实现认证、...

    spring开发源码

    4. **数据访问/集成**:Spring提供了对各种数据库访问技术的支持,包括JDBC、ORM(Object-Relational Mapping,如Hibernate、JPA)和OXM(Object-XML Mapping,如JAXB)。相关代码位于`org.springframework.jdbc`、`...

    收藏axis2的一本经书 axis2_WebService开发指南

    总之,《Axis2 WebService开发指南》是一本全面的指南,旨在帮助开发者掌握Axis2的核心特性和使用技巧,从而在Web服务开发中游刃有余。无论你是初学者还是经验丰富的开发者,都能从中受益。通过深入学习这本书,你将...

    用xml轻松开发Web网站

    8. 工具与库支持:了解一些常用的XML处理工具,如XML编辑器(如oXygen XML Editor)、验证工具(如XMLStarlet)和库(如Java的JAXB,Python的lxml),以及如何在开发过程中有效利用它们。 9. XML安全性:讨论XML...

    JAVA案例开发集锦

    ### JAVA案例开发集锦 ...通过以上介绍,《JAVA案例开发集锦》不仅涵盖了Java与Applet的基础知识、特效制作技巧,还深入探讨了Java与XML的集成应用,对于Java开发者而言是一本非常实用的参考书籍。

    java/j2ee学习资料大全第五部分(共5部分)

    理解 JAXB(Java Architecture for XML Binding)和 JAX-RS(Java API for RESTful Web Services)可以帮助创建和消费这些服务。 8. **MVC(Model-View-Controller)架构**:在 J2EE 开发中,Struts、Spring MVC 和...

    Oracle XML开发手册

    此外,手册还会探讨Oracle XML DB与其他XML技术的集成,例如JAXB(Java Architecture for XML Binding)和DOM(Document Object Model),以及如何在Java和.NET环境中使用Oracle XML DB的功能。 在性能优化方面,...

Global site tag (gtag.js) - Google Analytics