Unmarshaller class governs the process of deserializing XML
data into newly created Java content trees, optionally validating the XML
data as it is unmarshalled. It provides an overloading of unmarshal methods
for many different input kinds.
Unmarshalling from a File:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal( new File( "nosferatu.xml" ) );
Unmarshalling from an InputStream:
InputStream is = new FileInputStream( "nosferatu.xml" );
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal( is );
Unmarshalling from a URL:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
URL url = new URL( "http://beaker.east/nosferatu.xml" );
Object o = u.unmarshal( url );
Unmarshalling from a StringBuffer using a
javax.xml.transform.stream.StreamSource:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" ); Unmarshaller u = jc.createUnmarshaller(); StringBuffer xmlStr = new StringBuffer( "<?xml version="1.0"?>..." ); Object o = u.unmarshal( new StreamSource( new StringReader( xmlStr.toString() ) ) );
Unmarshalling from a org.w3c.dom.Node:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File( "nosferatu.xml"));
Object o = u.unmarshal( doc );
Unmarshalling from a javax.xml.transform.sax.SAXSource using a
client specified validating SAX2.0 parser:
// configure a validating SAX2.0 parser (Xerces2)
static final String JAXP_SCHEMA_LANGUAGE =
"http://java.sun.com/xml/jaxp/properties/schemaLanguage";
static final String JAXP_SCHEMA_LOCATION =
"http://java.sun.com/xml/jaxp/properties/schemaSource";
static final String W3C_XML_SCHEMA =
"http://www.w3.org/2001/XMLSchema";
System.setProperty( "javax.xml.parsers.SAXParserFactory",
"org.apache.xerces.jaxp.SAXParserFactoryImpl" );
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setValidating(true);
SAXParser saxParser = spf.newSAXParser();
try {
saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
saxParser.setProperty(JAXP_SCHEMA_LOCATION, "http://....");
} catch (SAXNotRecognizedException x) {
// exception handling omitted
}
XMLReader xmlReader = saxParser.getXMLReader();
SAXSource source =
new SAXSource( xmlReader, new InputSource( "http://..." ) );
// Setup Jakarta XML Binding to unmarshal
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
ValidationEventCollector vec = new ValidationEventCollector();
u.setEventHandler( vec );
// turn off the Jakarta XML Binding provider's default validation mechanism to
// avoid duplicate validation
u.setValidating( false )
// unmarshal
Object o = u.unmarshal( source );
// check for events
if( vec.hasEvents() ) {
// iterate over events
}
Unmarshalling from a StAX XMLStreamReader:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
javax.xml.stream.XMLStreamReader xmlStreamReader =
javax.xml.stream.XMLInputFactory().newInstance().createXMLStreamReader( ... );
Object o = u.unmarshal( xmlStreamReader );
Unmarshalling from a StAX XMLEventReader:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
javax.xml.stream.XMLEventReader xmlEventReader =
javax.xml.stream.XMLInputFactory().newInstance().createXMLEventReader( ... );
Object o = u.unmarshal( xmlEventReader );
Unmarshalling can deserialize XML data that represents either an entire XML document or a subtree of an XML document. Typically, it is sufficient to use the unmarshalling methods described by Unmarshal root element that is declared globally. These unmarshal methods utilizeJAXBContext's mapping of global XML element declarations and type definitions to Jakarta XML Binding mapped classes to initiate the unmarshalling of the root element of XML data. When theJAXBContext's mappings are not sufficient to unmarshal the root element of XML data, the application can assist the unmarshalling process by using the unmarshal by declaredType methods. These methods are useful for unmarshalling XML data where the root element corresponds to a local element declaration in the schema.
An unmarshal method never returns null. If the unmarshal process is unable to unmarshal the root of XML content to a Jakarta XML Binding mapped object, a fatal error is reported that terminates processing by throwing JAXBException.
Unmarshal a root element that is globally declared
The unmarshal methods that do not have andeclaredTypeparameter useJAXBContextto unmarshal the root element of an XML data. TheJAXBContextinstance is the one that was used to create thisUnmarshaller. TheJAXBContextinstance maintains a mapping of globally declared XML element and type definition names to Jakarta XML Binding mapped classes. The unmarshal method checks ifJAXBContexthas a mapping from the root element's XML name and/or@xsi:typeto a Jakarta XML Binding mapped class. If it does, it umarshalls the XML data using the appropriate Jakarta XML Binding mapped class. Note that when the root element name is unknown and the root element has an@xsi:type, the XML data is unmarshalled using that Jakarta XML Binding mapped class as the value of aJAXBElement. When theJAXBContextobject does not have a mapping for the root element's name nor its@xsi:type, if it exists, then the unmarshal operation will abort immediately by throwing aUnmarshalException. This exception scenario can be worked around by using the unmarshal by declaredType methods described in the next subsection.
The unmarshal methods with adeclaredTypeparameter enable an application to deserialize a root element of XML data, even when there is no mapping inJAXBContextof the root element's XML name. The unmarshaller unmarshals the root element using the application provided mapping specified as thedeclaredTypeparameter. Note that even when the root element's element name is mapped byJAXBContext, thedeclaredTypeparameter overrides that mapping for deserializing the root element when using these unmarshal methods. Additionally, when the root element of XML data has anxsi:typeattribute and that attribute's value references a type definition that is mapped to a Jakarta XML Binding mapped class byJAXBContext, that the root element'sxsi:typeattribute takes precedence over the unmarshal methodsdeclaredTypeparameter. These methods always return aJAXBElement<declaredType>instance. The table below shows how the properties of the returned JAXBElement instance are set.
Unmarshal By Declared Type returned JAXBElement JAXBElement Property Value name xml element namevalue instanceof declaredTypedeclaredType unmarshal method declaredTypeparameterscope null(actual scope is unknown)
The following is an example of unmarshal by declaredType method.
Unmarshal by declaredType from a org.w3c.dom.Node:
Schema fragment for example <xs:schema> <xs:complexType name="FooType">...<\xs:complexType> <!-- global element declaration "PurchaseOrder" --> <xs:element name="PurchaseOrder"> <xs:complexType> <xs:sequence> <!-- local element declaration "foo" --> <xs:element name="foo" type="FooType"/> ... </xs:sequence> </xs:complexType> </xs:element> </xs:schema> JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" ); Unmarshaller u = jc.createUnmarshaller(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File( "nosferatu.xml")); Element fooSubtree = ...; // traverse DOM till reach xml element foo, constrained by a // local element declaration in schema. // FooType is the Jakarta XML Binding mapping of the type of local element declaration foo. JAXBElement<FooType> foo = u.unmarshal( fooSubtree, FooType.class);
Support for SAX2.0 Compliant Parsers
A client application has the ability to select the SAX2.0 compliant parser
of their choice. If a SAX parser is not selected, then the Jakarta XML Binding Provider's
default parser will be used. Even though the Jakarta XML Binding Provider's default parser
is not required to be SAX2.0 compliant, all providers are required to allow
a client application to specify their own SAX2.0 parser. Some providers may
require the client application to specify the SAX2.0 parser at schema compile
time. See unmarshal(Source)
for more detail.
Validation and Well-Formedness
A client application can enable or disable JAXP validation mechanism via the
setSchema(javax.xml.validation.Schema)API. Sophisticated clients can specify their own validating SAX 2.0 compliant parser and bypass the JAXP validation mechanism using theunmarshal(Source)API.Since unmarshalling invalid XML content is defined in Jakarta XML Binding, the Unmarshaller default validation event handler was made more lenient than in JAXB 1.0. When schema-derived code generated by JAXB 1.0 binding compiler is registered with
JAXBContext, the default unmarshal validation handler isjakarta.xml.bind.helpers.DefaultValidationEventHandlerand it terminates the marshal operation after encountering either a fatal error or an error. For a Jakarta XML Binding client application, there is no explicitly defined default validation handler and the default event handling only terminates the unmarshal operation after encountering a fatal error.
There currently are not any properties required to be supported by all Jakarta XML Binding Providers on Unmarshaller. However, some providers may support their own set of provider specific properties.
TheUnmarshallerprovides two styles of callback mechanisms that allow application specific processing during key points in the unmarshalling process. In 'class defined' event callbacks, application specific code placed in Jakarta XML Binding mapped classes is triggered during unmarshalling. 'External listeners' allow for centralized processing of unmarshal events in one callback method rather than by type event callbacks.'Class defined' event callback methods allow any Jakarta XML Binding mapped class to specify its own specific callback methods by defining methods with the following method signature:
The class defined callback methods should be used when the callback method requires access to non-public methods and/or fields of the class.// This method is called immediately after the object is created and before the unmarshalling of this // object begins. The callback provides an opportunity to initialize JavaBean properties prior to unmarshalling. void beforeUnmarshal(Unmarshaller, Object parent); //This method is called after all the properties (except IDREF) are unmarshalled for this object, //but before this object is set to the parent object. void afterUnmarshal(Unmarshaller, Object parent);The external listener callback mechanism enables the registration of a
Listenerinstance with anUnmarshaller#setListener(Listener). The external listener receives all callback events, allowing for more centralized processing than per class defined callback methods. The external listener receives events when unmarshalling process is marshalling to a Jakarta XML Binding element or to Jakarta XML Binding mapped class.The 'class defined' and external listener event callback methods are independent of each other, both can be called for one event. The invocation ordering when both listener callback methods exist is defined in
Listener#beforeUnmarshal(Object, Object)andListener#afterUnmarshal(Object, Object).An event callback method throwing an exception terminates the current unmarshal process.
JAXBContext, Marshaller
| Modifier and Type | Class and Description |
|---|---|
| public abstract static class | Unmarshaller.Listener
Register an instance of an implementation of this class with |
| Modifier and Type | Method and Description |
|---|---|
| public < the type of the adapter A extends XmlAdapter | Returns: The adapter associated with the specified type.The type of the adapter. The specified instance will be used when
type)jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter#value()
refers to this type.Gets the adapter associated with the specified type. |
| public AttachmentUnmarshaller | |
| public ValidationEventHandler | Returns: the current ValidationEventHandler or the default event handler if it hasn't been setReturn the current event handler or the default event handler if one hasn't been set. |
| public Unmarshaller. | |
| public Object | Returns: the value of the requested propertythe name of the property to retrieve name)Get the particular property in the underlying implementation of
|
| public Schema | |
| public UnmarshallerHandler | Returns: the unmarshaller handler objectGet an unmarshaller handler object that can be used as a component in an XML pipeline. |
| public < the type of A extends XmlAdapterXmlAdapter | setAdapter(A
the configured instance of adapter)XmlAdapterAssociates a configured instance of |
| public < the type of the adapter A extends XmlAdapter | setAdapter(Class<A>
The type of the adapter. The specified instance will be used when
type, A jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter#value()
refers to this type.The instance of the adapter to be used. If null, it will un-register
the current adapter set for this type. adapter)Associates a configured instance of |
| public void | setAttachmentUnmarshaller(AttachmentUnmarshaller
the attachment unmarshaller to be set au)Associate a context that resolves cid's, content-id URIs, to binary data passed as attachments. |
| public void | setEventHandler(ValidationEventHandler
the validation event handler handler)Allow an application to register a |
| public void | setListener(Unmarshaller.
provides unmarshal event callbacks for this listenerUnmarshaller
Register unmarshal event callback |
| public void | setProperty(String
the name of the property to be set. This value can either
be specified using one of the constant fields or a user
supplied string. name, Object the value of the property to be set value)Set the particular property in the underlying implementation of
|
| public void | |
| public Object | |
| public Object | Returns: the newly created root object of the java content treethe InputStream to unmarshal XML data from is)Unmarshal XML data from the specified InputStream and return the resulting content tree. |
| public Object | |
| public Object | |
| public Object | Returns: the newly created root object of the java content treethe input source to unmarshal XML data from source)Unmarshal XML data from the specified SAX InputSource and return the resulting content tree. |
| public Object | |
| public < the XML Binding mapped class T> JAXBElement | unmarshal(Node
the document/element to unmarshal XML data from.
The caller must support at least Document and Element. node, Class<T> appropriate Jakarta XML Binding mapped class to hold declaredType)node's XML data.Unmarshal XML data by Jakarta XML Binding mapped |
| public Object | |
| public < the XML Binding mapped class T> JAXBElement | Returns: Java content rooted by JAXBElementthe XML Source to unmarshal XML data from (providers are
only required to support SAXSource, DOMSource, and StreamSource) source, Class<T> appropriate Jakarta XML Binding mapped class to hold declaredType)source's xml root elementUnmarshal XML data from the specified XML Source by |
| public Object | Returns: the newly created root object of the java content tree.The parser to be read. reader)Unmarshal XML data from the specified pull parser and return the resulting content tree. |
| public < the XML Binding mapped class T> JAXBElement | Returns: content tree rooted by JAXBElement representationThe parser to be read. reader, Class<T> appropriate Jakarta XML Binding mapped class to hold declaredType)reader's START_ELEMENT XML data.Unmarshal root element to Jakarta XML Binding mapped |
| public Object | Returns: the newly created root object of the java content tree.The parser to be read. reader)Unmarshal XML data from the specified pull parser and return the resulting content tree. |
| public < the XML Binding mapped class T> JAXBElement | Returns: content tree rooted by JAXBElement representationThe parser to be read. reader, Class<T> appropriate Jakarta XML Binding mapped class to hold declaredType)reader's START_ELEMENT XML data.Unmarshal root element to Jakarta XML Binding mapped |
| getAdapter | back to summary |
|---|---|
| public <A extends XmlAdapter Gets the adapter associated with the specified type.
This is the reverse operation of the
| |
| getAttachmentUnmarshaller | back to summary |
|---|---|
| public AttachmentUnmarshaller getAttachmentUnmarshaller() | |
| getEventHandler | back to summary |
|---|---|
| public ValidationEventHandler getEventHandler() throws JAXBException Return the current event handler or the default event handler if one hasn't been set.
| |
| getListener | back to summary |
|---|---|
| public Unmarshaller. Return
| |
| getProperty | back to summary |
|---|---|
| public Object getProperty(String name) throws PropertyException Get the particular property in the underlying implementation of
| |
| getSchema | back to summary |
|---|---|
| public Schema getSchema() Get the JAXP
| |
| getUnmarshallerHandler | back to summary |
|---|---|
| public UnmarshallerHandler getUnmarshallerHandler() Get an unmarshaller handler object that can be used as a component in an XML pipeline.
The Jakarta XML Binding Provider can return the same handler object for multiple
invocations of this method. In other words, this method does not
necessarily create a new instance of
| |
| setAdapter | back to summary |
|---|---|
| public <A extends XmlAdapter Associates a configured instance of
This is a convenience method that invokes
| |
| setAdapter | back to summary |
|---|---|
| public <A extends XmlAdapter Associates a configured instance of
Every unmarshaller internally maintains a
This method allows applications to use a configured instance of
| |
| setAttachmentUnmarshaller | back to summary |
|---|---|
| public void setAttachmentUnmarshaller(AttachmentUnmarshaller au) Associate a context that resolves cid's, content-id URIs, to
binary data passed as attachments.
Unmarshal time validation, enabled via
| |
| setEventHandler | back to summary |
|---|---|
| public void setEventHandler(ValidationEventHandler handler) throws JAXBException Allow an application to register a
The Calling this method with a null parameter will cause the Unmarshaller to revert back to the default event handler.
| |
| setListener | back to summary |
|---|---|
| public void setListener(Unmarshaller.
Register unmarshal event callback
There is only one Listener per Unmarshaller. Setting a Listener replaces the previous set Listener.
One can unregister current Listener by setting listener to
| |
| setProperty | back to summary |
|---|---|
| public void setProperty(String name, Object value) throws PropertyException Set the particular property in the underlying implementation of
| |
| setSchema | back to summary |
|---|---|
| public void setSchema(Schema schema) Specify the JAXP
Initially this property is set to
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(File f) throws JAXBException Unmarshal XML data from the specified file and return the resulting content tree. Implements Unmarshal Global Root Element.
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(InputStream is) throws JAXBException Unmarshal XML data from the specified InputStream and return the resulting content tree. Validation event location information may be incomplete when using this form of the unmarshal API. Implements Unmarshal Global Root Element.
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(Reader reader) throws JAXBException Unmarshal XML data from the specified Reader and return the resulting content tree. Validation event location information may be incomplete when using this form of the unmarshal API, because a Reader does not provide the system ID. Implements Unmarshal Global Root Element.
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(URL url) throws JAXBException Unmarshal XML data from the specified URL and return the resulting content tree. Implements Unmarshal Global Root Element.
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(InputSource source) throws JAXBException Unmarshal XML data from the specified SAX InputSource and return the resulting content tree. Implements Unmarshal Global Root Element.
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(Node node) throws JAXBException Unmarshal global XML data from the specified DOM tree and return the resulting content tree. Implements Unmarshal Global Root Element.
| |
| unmarshal | back to summary |
|---|---|
| public <T> JAXBElement Unmarshal XML data by Jakarta XML Binding mapped Implements Unmarshal by Declared Type
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(Source source) throws JAXBException Unmarshal XML data from the specified XML Source and return the resulting content tree. Implements Unmarshal Global Root Element.
A client application can choose not to use the default parser mechanism
supplied with their Jakarta XML Binding provider. Any SAX 2.0 compliant parser can be
substituted for the Jakarta XML Binding provider's default mechanism. To do so, the
client application must properly configure a
This parser replacement mechanism can also be used to replace the Jakarta XML Binding
provider's unmarshal-time validation engine. The client application
must properly configure their SAX 2.0 compliant parser to perform
validation (as shown in the example above). Any Note specifying a substitute validating SAX 2.0 parser for unmarshalling does not necessarily replace the validation engine used by the Jakarta XML Binding provider for performing on-demand validation.
The only way for a client application to specify an alternate parser
mechanism to be used during unmarshal is via the
| |
| unmarshal | back to summary |
|---|---|
| public <T> JAXBElement Unmarshal XML data from the specified XML Source by Implements Unmarshal by Declared Type See SAX 2.0 Parser Pluggability
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(XMLStreamReader reader) throws JAXBException Unmarshal XML data from the specified pull parser and return the resulting content tree. Implements Unmarshal Global Root Element.
This method assumes that the parser is on a START_DOCUMENT or
START_ELEMENT event. Unmarshalling will be done from this
start event to the corresponding end event. If this method
returns successfully, the
| |
| unmarshal | back to summary |
|---|---|
| public <T> JAXBElement Unmarshal root element to Jakarta XML Binding mapped This method implements unmarshal by declaredType.
This method assumes that the parser is on a START_DOCUMENT or
START_ELEMENT event. Unmarshalling will be done from this
start event to the corresponding end event. If this method
returns successfully, the
| |
| unmarshal | back to summary |
|---|---|
| public Object unmarshal(XMLEventReader reader) throws JAXBException Unmarshal XML data from the specified pull parser and return the resulting content tree. This method is an Unmarshal Global Root method.
This method assumes that the parser is on a START_DOCUMENT or
START_ELEMENT event. Unmarshalling will be done from this
start event to the corresponding end event. If this method
returns successfully, the
| |
| unmarshal | back to summary |
|---|---|
| public <T> JAXBElement Unmarshal root element to Jakarta XML Binding mapped This method implements unmarshal by declaredType.
This method assumes that the parser is on a START_DOCUMENT or
START_ELEMENT event. Unmarshalling will be done from this
start event to the corresponding end event. If this method
returns successfully, the
| |
Register an instance of an implementation of this class with Unmarshaller to externally listen
for unmarshal events.
This class enables pre and post processing of an instance of a Jakarta XML Binding mapped class as XML data is unmarshalled into it. The event callbacks are called when unmarshalling XML content into a JAXBElement instance or a Jakarta XML Binding mapped class that represents a complex type definition. The event callbacks are not called when unmarshalling to an instance of a Java datatype that represents a simple type definition.
External listener is one of two different mechanisms for defining unmarshal event callbacks. See Unmarshal Event Callbacks for an overview.
(@link #setListener(Listener)} (@link #getListener()}| Access | Constructor and Description |
|---|---|
| protected |
| Modifier and Type | Method and Description |
|---|---|
| public void | afterUnmarshal(Object
non-null instance of Jakarta XML Binding mapped class prior to unmarshalling into it. target, Object instance of Jakarta XML Binding mapped class that will reference parent)target.
null when target is root element.
Callback method invoked after unmarshalling XML data into |
| public void | beforeUnmarshal(Object
non-null instance of Jakarta XML Binding mapped class prior to unmarshalling into it. target, Object instance of Jakarta XML Binding mapped class that will eventually reference parent)target.
null when target is root element.
Callback method invoked before unmarshalling into |
| Listener | back to summary |
|---|---|
| protected Listener() Do-nothing constructor for the derived classes. | |
| afterUnmarshal | back to summary |
|---|---|
| public void afterUnmarshal(Object target, Object parent)
Callback method invoked after unmarshalling XML data into
This method is invoked after all the properties (except IDREF)
are unmarshalled into | |
| beforeUnmarshal | back to summary |
|---|---|
| public void beforeUnmarshal(Object target, Object parent)
Callback method invoked before unmarshalling into
This method is invoked immediately after | |