Search code examples
javajakarta-eejaxb

How to generate JAXB classes from XSD?


I'm a total newbie with XML. I'm doing a Java EE project REST implementation and we return a lot of XML. With this we decided to use JAXB. So far, we manually coded the Models for the XML.

But there are already these complex structures we don't know how to code. We've read about generating classes from XSD. We do have an XSD.

My questions:

1.) I've read about XJC, where can I find it?

2.) Do we have to install the whole JAXB? (so what we used so far? isn't this JAXB?)


Solution

  • XJC is included in the bin directory in the JDK starting with Java SE 6. For an example see:

    The contents of the blog are the following:

    Processing Atom Feeds with JAXB Atom is an XML format for representing web feeds. A standard format allows reader applications to display feeds from different sources. In this example we will process the Atom feed for this blog.

    Demo

    In this example we will use JAXB to convert the Atom XML feed corresponding to this blog to objects and then back to 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);
        }
    
    }
    

    JAXB Model

    The following model was generated by the schema to Java compiler (XJC). I have omitted the get/set methods and comments to save space.

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

    package-info

    @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>();
    }
    

    Content Type

    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>();
    }
    

    IdType

    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>();
    }
    

    LinkType

    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>();
    }
    

    SourceType

    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>();
    }
    

    TextType

    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>();
    }