由于JAXB是JDK的一部分,因此它是处理XML文档最常用的框架之一。 它提供了一种从XML文档检索数据并将其存储到Java类的简便方法。 因为几乎每个Java开发人员都已经使用过JAXB,所以我不会解释不同的JAXB批注。 相反,我将专注于一个名为xjc的命令行工具,并向您展示如何基于现有XSD架构描述生成绑定类。

为现有XML接口实现所有绑定类可能是一项耗时且繁琐的任务。 但好消息是,您不需要这样做。 如果您具有XSD架构描述,则可以使用xjc绑定编译器创建所需的类。 甚至更好的是,xjc是JDK的一部分。 因此,不需要外部工具,如果需要,您应该始终准备好使用它。

使用xjc

如下面的代码片段所示,xjc支持许多选项。 最重要的是:

  • -d定义生成的类应在文件系统中存储的位置
  • -p定义要使用的软件包,当然
  • -帮助,如果您还有其他需要。
Usage: xjc [-options ...] <schema file/URL/dir/jar> ... [-b <bindinfo>] ...
If dir is specified, all schema files in it will be compiled.
If jar is specified, /META-INF/sun-jaxb.episode binding file will be compiled.
Options:-nv                :  do not perform strict validation of the input schema(s)-extension         :  allow vendor extensions - do not strictly follow theCompatibility Rules and App E.2 from the JAXB Spec-b <file/dir>      :  specify external bindings files (each <file> must have its own -b)If a directory is given, **/*.xjb is searched-d <dir>           :  generated files will go into this directory-p <pkg>           :  specifies the target package-httpproxy <proxy> :  set HTTP/HTTPS proxy. Format is [user[:password]@]proxyHost:proxyPort-httpproxyfile <f> :  Works like -httpproxy but takes the argument in a file to protect password-classpath <arg>   :  specify where to find user class files-catalog <file>    :  specify catalog files to resolve external entity referencessupport TR9401, XCatalog, and OASIS XML Catalog format.-readOnly          :  generated files will be in read-only mode-npa               :  suppress generation of package level annotations (**/package-info.java)-no-header         :  suppress generation of a file header with timestamp-target (2.0|2.1)  :  behave like XJC 2.0 or 2.1 and generate code that doesnt use any 2.2 features.-encoding <encoding> :  specify character encoding for generated source files-enableIntrospection :  enable correct generation of Boolean getters/setters to enable Bean Introspection apis-contentForWildcard  :  generates content property for types with multiple xs:any derived elements-xmlschema         :  treat input as W3C XML Schema (default)-relaxng           :  treat input as RELAX NG (experimental,unsupported)-relaxng-compact   :  treat input as RELAX NG compact syntax (experimental,unsupported)-dtd               :  treat input as XML DTD (experimental,unsupported)-wsdl              :  treat input as WSDL and compile schemas inside it (experimental,unsupported)-verbose           :  be extra verbose-quiet             :  suppress compiler output-help              :  display this help message-version           :  display version information-fullversion       :  display full version informationExtensions:-Xinject-code      :  inject specified Java code fragments into the generated code-Xlocator          :  enable source location support for generated code-Xsync-methods     :  generate accessor methods with the 'synchronized' keyword-mark-generated    :  mark the generated code as @javax.annotation.Generated-episode <FILE>    :  generate the episode file for separate compilation

好的,让我们看一个例子。 我们将使用以下XSD模式定义和xjc来生成具有描述的属性和必需的JAXB批注的AuthorBook类。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="author" type="author"/><xs:element name="book" type="book"/><xs:complexType name="author"><xs:sequence><xs:element name="firstName" type="xs:string" minOccurs="0"/><xs:element name="lastName" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType><xs:complexType name="book"><xs:sequence><xs:element ref="author" minOccurs="0"/><xs:element name="pages" type="xs:int"/><xs:element name="publicationDate" type="xs:dateTime" minOccurs="0"/><xs:element name="title" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType>
</xs:schema>

以下命令调用xjc,并为生成的类,包和XSD模式文件提供目标目录。

xjc -d src -p blog.thoughts.on.java schema.xsdparsing a schema...
compiling a schema...
blog\thoughts\on\java\Author.java
blog\thoughts\on\java\Book.java
blog\thoughts\on\java\ObjectFactory.java

好的,操作成功完成,现在在src目录中有3个生成的类。 这可能比某些人预期的要多。 因此,让我们看看它们中的每一个。

类Author和Book看起来像预期的那样。 它们包含XSD架构中描述的属性和必需的JAXB批注。

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2014.01.13 at 07:38:24 PM CET
//package blog.thoughts.on.java;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;/*** <p>Java class for author complex type.* * <p>The following schema fragment specifies the expected content contained within this class.* * <pre>* <complexType name="author">*   <complexContent>*     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">*       <sequence>*         <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>*         <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>*       </sequence>*     </restriction>*   </complexContent>* </complexType>* </pre>* * */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "author", propOrder = {"firstName","lastName"
})
public class Author {protected String firstName;protected String lastName;/*** Gets the value of the firstName property.* * @return*     possible object is*     {@link String }*     */public String getFirstName() {return firstName;}/*** Sets the value of the firstName property.* * @param value*     allowed object is*     {@link String }*     */public void setFirstName(String value) {this.firstName = value;}/*** Gets the value of the lastName property.* * @return*     possible object is*     {@link String }*     */public String getLastName() {return lastName;}/*** Sets the value of the lastName property.* * @param value*     allowed object is*     {@link String }*     */public void setLastName(String value) {this.lastName = value;}}
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2014.01.13 at 07:38:24 PM CET
//package blog.thoughts.on.java;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;/*** <p>Java class for book complex type.* * <p>The following schema fragment specifies the expected content contained within this class.* * <pre>* <complexType name="book">*   <complexContent>*     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">*       <sequence>*         <element ref="{}author" minOccurs="0"/>*         <element name="pages" type="{http://www.w3.org/2001/XMLSchema}int"/>*         <element name="publicationDate" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>*         <element name="title" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>*       </sequence>*     </restriction>*   </complexContent>* </complexType>* </pre>* * */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "book", propOrder = {"author","pages","publicationDate","title"
})
public class Book {protected Author author;protected int pages;@XmlSchemaType(name = "dateTime")protected XMLGregorianCalendar publicationDate;protected String title;/*** Gets the value of the author property.* * @return*     possible object is*     {@link Author }*     */public Author getAuthor() {return author;}/*** Sets the value of the author property.* * @param value*     allowed object is*     {@link Author }*     */public void setAuthor(Author value) {this.author = value;}/*** Gets the value of the pages property.* */public int getPages() {return pages;}/*** Sets the value of the pages property.* */public void setPages(int value) {this.pages = value;}/*** Gets the value of the publicationDate property.* * @return*     possible object is*     {@link XMLGregorianCalendar }*     */public XMLGregorianCalendar getPublicationDate() {return publicationDate;}/*** Sets the value of the publicationDate property.* * @param value*     allowed object is*     {@link XMLGregorianCalendar }*     */public void setPublicationDate(XMLGregorianCalendar value) {this.publicationDate = value;}/*** Gets the value of the title property.* * @return*     possible object is*     {@link String }*     */public String getTitle() {return title;}/*** Sets the value of the title property.* * @param value*     allowed object is*     {@link String }*     */public void setTitle(String value) {this.title = value;}}

第三类,也许是意外类,是ObjectFactory类。 它包含每个生成的类或接口的工厂方法。 如果您需要创建对象的JAXBElement表示形式,这将非常有用。

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2014.01.13 at 07:38:24 PM CET
//package blog.thoughts.on.java;import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;/*** This object contains factory methods for each * Java content interface and Java element interface * generated in the blog.thoughts.on.java 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 _Book_QNAME = new QName("", "book");/*** Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: blog.thoughts.on.java* */public ObjectFactory() {}/*** Create an instance of {@link Author }* */public Author createAuthor() {return new Author();}/*** Create an instance of {@link Book }* */public Book createBook() {return new Book();}/*** Create an instance of {@link JAXBElement }{@code <}{@link Author }{@code >}}* */@XmlElementDecl(namespace = "", name = "author")public JAXBElement<Author> createAuthor(Author value) {return new JAXBElement<Author>(_Author_QNAME, Author.class, null, value);}/*** Create an instance of {@link JAXBElement }{@code <}{@link Book }{@code >}}* */@XmlElementDecl(namespace = "", name = "book")public JAXBElement<Book> createBook(Book value) {return new JAXBElement<Book>(_Book_QNAME, Book.class, null, value);}}

结论

我们研究了xjc并将其用于为现有XSD模式定义生成所需的绑定类。 xjc为每种复杂类型生成一个类,并为简化创建JAXBElement表示形式提供一个附加的工厂类。

您如何看待xjc和生成的代码? 请给我评论,并告诉我有关的信息。

我认为该工具可生成非常干净的代码并节省大量时间。 在大多数情况下,可以将生成的代码直接添加到项目中。 但是,即使不是这种情况,基于生成的代码进行一些重构比自己做所有事情要快得多。

翻译自: https://www.javacodegeeks.com/2014/05/generate-your-jaxb-classes-in-a-second-with-xjc.html

使用xjc一秒钟生成您的JAXB类相关推荐

  1. jaxb-xjc.jar_使用xjc在一秒钟内生成您的JAXB类

    jaxb-xjc.jar 由于JAXB是JDK的一部分,因此它是处理XML文档最常用的框架之一. 它提供了一种从XML文档检索数据并将其存储到Java类的简便方法. 因为几乎每个Java开发人员都已经 ...

  2. jaxb xsd生成xml_使用JAXB和Jackson从XSD生成JSON模式

    jaxb xsd生成xml 在本文中,我演示了一种从XML Schema (XSD)生成JSON Schema的 方法 . 在概述从XML Schema创建JSON Schema的方法的同时,本文还演 ...

  3. jaxb 生成java类_重用生成的JAXB类

    jaxb 生成java类 在本文中,我将演示如何利用XJC扩展来重用以前从XML模式生成的类. 当其他XML架构导入XML架构并且您不想每次都生成相同的类时,这很有用. 导入的架构(Product.x ...

  4. jaxb xsd生成xml_使用JAXB从XSD生成XML

    jaxb xsd生成xml 这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子. Mohamed解释了如何使用JAXB从给定的XSD生成X ...

  5. 重用生成的JAXB类

    在本文中,我将演示如何利用– XJC扩展来重用以前从XML模式生成的类. 当其他XML架构导入XML架构并且您不想每次都生成相同的类时,这很有用. 导入的架构(Product.xsd) 以下XML模式 ...

  6. jaxb xml 生成 java_使用 JAXB 工具根据 Java 类生成 XML 模式

    使用 JAXB 工具根据 Java 类生成 XML 模式 2010-06-10 18:24:26|  分类: web service |字号 订阅 关键字: java to xml 使用 JAXB 工 ...

  7. Shell编程 ——for循环、if语句、sleep睡眠。——每秒钟生成一个文件,一共生成60个文件

    实践: 每秒钟生成一个文件,一共生成60个文件,文件名格式是"20190101_101010.txt".但是,第10.20秒,不生成文件. #!/bin/sh for((i=0;i ...

  8. xjc java_JDK Tools - xjc: 将 XML Schema 编译成 Java 类

    xjc 是 JAXB 将 xsd 生成 Java 类的工具. 命令格式 xjc [ options ] schema file/URL/dir/jar ... [-b bindinfo ] ... 命 ...

  9. generator自动生成mybatis配置和类信息

    generator自动生成mybatis的xml配置.model.map等信息: 1.下载mybatis-generator-core-1.3.2.jar包.        网址:http://cod ...

最新文章

  1. exchange 2003配置ASSP 反垃圾邮件
  2. sscanf用法(转)
  3. 作者赠送的《我的第一本c++书》收到啦
  4. golang显式类型初始化
  5. 2020年高等数学方法与提高(上海理工大学)学习笔记:一元函数微分学
  6. Android --- ImageView的scaleType属性讲解
  7. 爱优腾芒“跑马圈地”,AI广告营销能拯救“盈利难”的视频平台吗?
  8. 深入理解C语言系列之内存和地址的故事(虚拟内存分区、全局变量与静态变量、外部函数内部函数、选择性编译)
  9. 机器学习-数据科学库-day5
  10. 计算机毕业设计(附源码)python兴澜幼儿园管理系统
  11. dcp9020cdn硒鼓!错误_打印机出现硒鼓错误怎么办?打印机显示硒鼓错误分析解决...
  12. 地理坐标(经纬度坐标)和屏幕坐标(xy坐标)间的转换
  13. 目前最完美的魔兽世界服务端AzerothCore,Centos系统docker编译教程
  14. 闲置路由器做无线打印服务器
  15. C++随机生成中文名的实例
  16. Apple MacPad Pro会是什么样?
  17. 计算机配件内存计入什么科目,机器配件应计入什么会计科目?
  18. Excel中的格式刷如何使用?
  19. Eclipse 一直 invoking Maven Project Bulider 问题
  20. RH Timer for Mac(定时器软件)

热门文章

  1. ssm执行linux 指令,Linux逻辑卷快照及ssm的使用
  2. Linux ss命令 报错,ECS Linux中ss命令显示连接状态的使用说明
  3. java常用代码_Java 中常用代码 (欢迎补充)
  4. renderthread是什么_Android5.0中 hwui 中 RenderThread 工作流程
  5. leetcode初级算法1.删除排序数组中的重复项
  6. fluent瞬态_Java中的瞬态关键字及其使用
  7. payara 创建 集群_Apache Payara:让我们加密
  8. java bean 验证_Java Bean验证基础
  9. swarm部署集群_WildFly Swarm –将Java EE应用程序部署为独立的Jar
  10. ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体