tutorial generate from create convertir classes clases java java-ee jaxb
http://java.net/downloads/jaxb-workshop/IDE%20plugins/org.jvnet.jaxbw.zip

java - generate - ¿Cómo generar clases JAXB desde XSD?



xsd jaxb tutorial (11)

Soy un novato total con XML. Estoy haciendo una implementación REST del proyecto Java EE y devolvemos una gran cantidad de XML. Con esto, decidimos usar JAXB. Hasta ahora, hemos codificado manualmente los Modelos para el XML.

Pero ya existen estas estructuras complejas que no sabemos cómo codificar. Hemos leído sobre la generación de clases de XSD. Nosotros tenemos un XSD.

Mis preguntas:

1.) He leído sobre XJC, ¿dónde puedo encontrarlo?

2.) ¿Tenemos que instalar todo JAXB? (Entonces, ¿qué hemos usado hasta ahora? ¿No es esto JAXB?)



1) Puede usar la utilidad java estándar xjc - ([su directorio de inicio de java] / bin / xjc.exe). Pero necesita crear un script .bat (o .sh) para usarlo.

por ejemplo, generate.bat:

[your java home dir]/bin/xjc.exe %1 %2 %3

por ejemplo, test-scheme.xsd:

<?xml version="1.0"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://myprojects.net/xsd/TestScheme" xmlns="http://myprojects.net/xsd/TestScheme"> <xs:element name="employee" type="PersonInfoType"/> <xs:complexType name="PersonInfoType"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema>

Ejecute el archivo .bat con los parámetros: generate.bat test-scheme.xsd -d [your src dir]

Para obtener más información, utilice esta documentación: http://docs.oracle.com/javaee/5/tutorial/doc/bnazg.html

y esto - http://docs.oracle.com/javase/6/docs/technotes/tools/share/xjc.html

2) JAXB (utilidad xjc) se instala junto con JDK6 de forma predeterminada.


En Eclipse , haga clic con el botón derecho en el archivo xsd que desea obtener -> Generar -> Java ... -> Generador: "Esquema de las clases JAXB Java".

Acabo de enfrentar el mismo problema, tenía un montón de archivos xsd , solo uno de ellos era el XML Root Element y funcionó bien lo que expliqué anteriormente en Eclipse


En intellij haga clic en el archivo .xsd -> WebServices -> Genere el código de Java desde el esquema Xml JAXB y luego proporcione la ruta del paquete y el nombre del paquete -> ok


Para Eclipse STS (3.5 al menos) no necesita instalar nada. Haga clic derecho en schema.xsd -> Generate -> JAXB Classes. Tendrás que especificar el paquete y la ubicación en el próximo paso y eso es todo, tus clases deberían generarse. Supongo que todas las soluciones mencionadas anteriormente funcionan, pero esto parece ser de lejos el más fácil (para usuarios de STS).

[ACTUALIZACIÓN] Eclipse STS versión 3.6 (basada en Kepler) viene con la misma funcionalidad.


Puede descargar los archivos jar JAXB desde http://jaxb.java.net/2.2.5/ No necesita instalar nada, solo invoque el comando xjc y con el argumento classpath apuntando a los archivos jar JAXB descargados.



También puede generar código fuente desde el esquema utilizando el complemento jaxb2-maven- plugin:

<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.2</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <sources> <source>src/main/resources/your_schema.xsd</source> </sources> <xjbSources> <xjbSource>src/main/resources/bindings.xjb</xjbSource> </xjbSources> <packageName>some_package</packageName> <outputDirectory>src/main/java</outputDirectory> <clearOutputDir>false</clearOutputDir> <generateEpisode>false</generateEpisode> <noGeneratedHeaderComments>true</noGeneratedHeaderComments> </configuration> </plugin>


XJC está incluido en el directorio bin del JDK que comienza con Java SE 6. Para ver un ejemplo, consulte:

Los contenidos del blog son los siguientes:

Procesamiento de Feeds Atom con JAXB Atom es un formato XML para representar feeds web. Un formato estándar permite que las aplicaciones del lector muestren feeds de diferentes fuentes. En este ejemplo, procesaremos el feed de Atom para este blog.

Manifestación

En este ejemplo, usaremos JAXB para convertir los datos XML de Atom correspondientes a este blog a objetos y luego a XML.

import java.io.InputStream; import java.net.URL; import javax.xml.bind.*; import javax.xml.transform.stream.StreamSource; import org.w3._2005.atom.FeedType; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance("org.w3._2005.atom"); Unmarshaller unmarshaller = jc.createUnmarshaller(); URL url = new URL("http://bdoughan.blogspot.com/atom.xml"); InputStream xml = url.openStream(); JAXBElement<feedtype> feed = unmarshaller.unmarshal(new StreamSource(xml), FeedType.class); xml.close(); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(feed, System.out); } }

Modelo JAXB

El siguiente modelo fue generado por el esquema para el compilador de Java (XJC). He omitido los métodos y comentarios get / set para ahorrar espacio.

xjc -d generated http://www.kbcafe.com/rss/atom.xsd.xml

paquete-información

@XmlSchema( namespace = "http://www.w3.org/2005/Atom", elementFormDefault = XmlNsForm.QUALIFIED) @XmlAccessorType(XmlAccessType.FIELD) package org.w3._2005.atom; import javax.xml.bind.annotation.*;

CategoryType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "categoryType") public class CategoryType { @XmlAttribute(required = true) protected String term; @XmlAttribute @XmlSchemaType(name = "anyURI") protected String scheme; @XmlAttribute protected String label; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

Tipo de contenido

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "contentType", propOrder = {"content"}) public class ContentType { @XmlMixed @XmlAnyElement(lax = true) protected List<Object> content; @XmlAttribute protected String type; @XmlAttribute @XmlSchemaType(name = "anyURI") protected String src; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

DateTimeType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; @XmlType(name = "dateTimeType", propOrder = {"value"}) public class DateTimeType { @XmlValue @XmlSchemaType(name = "dateTime") protected XMLGregorianCalendar value; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

EntryType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "entryType", propOrder = {"authorOrCategoryOrContent"}) public class EntryType { @XmlElementRefs({ @XmlElementRef(name = "id", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "rights", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "summary", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "title", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "author", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "source", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "updated", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "category", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "content", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "published", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "contributor", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "link", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class) }) @XmlAnyElement(lax = true) protected List<Object> authorOrCategoryOrContent; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

FeedType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "feedType", propOrder = {"authorOrCategoryOrContributor"}) public class FeedType { @XmlElementRefs({ @XmlElementRef(name = "link", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "updated", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "category", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "rights", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "contributor", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "title", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "id", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "generator", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "icon", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "subtitle", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "author", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "entry", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "logo", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class) }) @XmlAnyElement(lax = true) protected List<Object> authorOrCategoryOrContributor; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

GeneratorType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "generatorType", propOrder = {"value"}) public class GeneratorType { @XmlValue protected String value; @XmlAttribute @XmlSchemaType(name = "anyURI") protected String uri; @XmlAttribute protected String version; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

IconType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "iconType", propOrder = {"value"}) public class IconType { @XmlValue @XmlSchemaType(name = "anyURI") protected String value; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

Tipo de identificación

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "idType", propOrder = {"value"}) public class IdType { @XmlValue @XmlSchemaType(name = "anyURI") protected String value; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

Tipo de enlace

package org.w3._2005.atom; import java.math.BigInteger; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "linkType", propOrder = {"content"}) public class LinkType { @XmlValue protected String content; @XmlAttribute(required = true) @XmlSchemaType(name = "anyURI") protected String href; @XmlAttribute protected String rel; @XmlAttribute protected String type; @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "NMTOKEN") protected String hreflang; @XmlAttribute protected String title; @XmlAttribute @XmlSchemaType(name = "positiveInteger") protected BigInteger length; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

LogoType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "logoType", propOrder = {"value"}) public class LogoType { @XmlValue @XmlSchemaType(name = "anyURI") protected String value; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

PersonType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "personType", propOrder = {"nameOrUriOrEmail"}) public class PersonType { @XmlElementRefs({ @XmlElementRef(name = "email", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "name", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "uri", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class) }) @XmlAnyElement(lax = true) protected List<Object> nameOrUriOrEmail; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

Tipo de fuente

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "sourceType", propOrder = {"authorOrCategoryOrContributor"}) public class SourceType { @XmlElementRefs({ @XmlElementRef(name = "updated", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "category", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "subtitle", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "logo", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "generator", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "icon", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "title", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "id", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "author", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "contributor", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "link", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class), @XmlElementRef(name = "rights", namespace = "http://www.w3.org/2005/Atom", type = JAXBElement.class) }) @XmlAnyElement(lax = true) protected List<Object> authorOrCategoryOrContributor; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

Tipo de texto

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "textType", propOrder = {"content"}) public class TextType { @XmlMixed @XmlAnyElement(lax = true) protected List<Object> content; @XmlAttribute @XmlJavaTypeAdapter(CollapsedStringAdapter.class) protected String type; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }

UriType

package org.w3._2005.atom; import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.*; import javax.xml.namespace.QName; @XmlType(name = "uriType", propOrder = {"value"}) public class UriType { @XmlValue @XmlSchemaType(name = "anyURI") protected String value; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlSchemaType(name = "anyURI") protected String base; @XmlAttribute(namespace = "http://www.w3.org/XML/1998/namespace") @XmlJavaTypeAdapter(CollapsedStringAdapter.class) @XmlSchemaType(name = "language") protected String lang; @XmlAnyAttribute private Map<QName, String> otherAttributes = new HashMap<QName, String>(); }


cxf es un gran soporte para este tipo de cosas, por ejemplo

<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-xjc-plugin</artifactId> <version>2.3.0</version> <configuration> <extensions> <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension> </extensions> </configuration> <executions> <execution> <id>generate-sources-trans</id> <phase>generate-sources</phase> <goals> <goal>xsdtojava</goal> </goals> <configuration> <sourceRoot>${basedir}/src/main/java</sourceRoot> <xsdOptions> <xsdOption> <xsd>src/main/resources/xxx.xsd</xsd> </xsdOption> </xsdOptions> </configuration> </execution> </executions> </plugin>