XOB is an alternative to JAXB,
JBind, etc. XOB lets you define interfaces
representing XML tags and have them automatically implemented runtime through the use
of reflection giving you an object representation of your XML files.
- Unmarshals XML files into an XML object structure defined by interfaces.
- Creates an XML object structure using a factory interface.
- Validates an XML object structure using DTD or Schema.
- Marshals an XML object structure into an XML file.
- Supports namespaces.
- Generator for generating XML object interfaces from an XML schema.
- Schema documentatoin tags becomes javadoc for generated interfaces.
- Extra feature: HTML documentation generator for an XML schema.
- Contains simple to use Ant tasks for both generators.
- Allows the user to choose the name of any XML object (interface name) mapping
to an XML element, even when using the generator! Or you can let the generator
create a name from the element name.
Currently I think XOB does more than JAXB. I haven't looked that closely on JBind, but
it seems to have a lot more APIs than XOB. There are probably other similar tools out
there that I'm not aware of.
The main differences in XOB is:
XOB is designed to be straight forward and simple
to use. It also takes a different approach by only needing interfaces. All interfaces are provided
with a generic implementation runtime through the use of the java.lang.reflect.Proxy class. This means
less code taking up space in your jar files.
As of version 3.1 this code is distributed under the Apache Software Licence 2.0.
- XOB only uses interfaces, there is no generated classes.
- XOB has a generator that generates from a schema, but can also be used manually without
This code was originaly in complete missunderstanding from my part released under the GPL. I never
had the intention to limit the use of this library to only open/free products! The Apache guys have made a
much more sensible license.
This is currently a one man show. Anybody interested is welcome to join me, it is
however not a very large project.
My name is Tommy Svensson and I can be reached at:
Why did I do XOB when there are other alternatives already available ?
- Because I could not use JAXB due to its license.
- Because I was not aware of JBind until I was half done!
- Because XOB is more flexible due to using only interfaces.
- Because it was fun!
- Because it was educational!
- Because I get the job done my way! :-)
XOB makes use of the JAXP 1.1 and 1.2 apis. JAXP 1.2 is required for schema validation.
You can however use a non JAXP parser if you create a wrapper for it that implements the
xob.XMLParser interface and set and instance of that on the XMLObjectBinder instance. The
only catch is that the parser must be able to deliver an org.w3c.dom.Document structure!
Xerces 2.4.0+ implements JAXP 1.2. JDK 1.4 includes the Crimson parser which implements
JAXP 1.1. These are the only 2 parsers I've tested with.
- An XML parser implementing JAXP 1.1/1.2.
- Can plugin non JAXP parsers also.
|History / news
Version 3.1 released!
- Maven2 xobgen plugin
XOB is now build with maven2, and to make it easier to use with maven2 I made a
plugin for running xobgen during the generate-sources phase. See userguide for
Version 3.0 released!
It is now possible to apply special filters to a binder instance before unmarshalling. When filters
are used all the data in the XML file are still read into memory, but element getters return only those
elements that match the filter. This means elements can be modified and then marshalled again without
loosing any data. See the userguide for more info.
- Special override of subelement multiplicity in an XMLSchema when using XOBGen to generate interfaces.
If the schema says there are many of a subelement you can now with an XML comment tell XOBGen that
it only returns one element. This is useful in conjunction with filtering where a filter can cause a
list of several subelements to always result in only one matching the filter value. This allows you
to treat it as if it only returns one.
Both of these features were added to support a configuration component that reads the same configuration
file on several nodes in a cluster, and needed node specific values for certain properties. The node name
is supplied as filter value resulting in only one property being returned on each node, but I can specify
a per node value in the config XML file.
Filtering on "node" attribute with filter value "node1" will only return the myproperty element
having value "abc".
Again, see the userguide for more info on how this works. You can also look at the examples/validating/schema/filter
- Jar filenames now contain a version number.
Upp to now only the distribution zip had a version number in the name. This made it a bit difficult
to determine which version of XOB you had when only the jars, like xob.jar is included in a project distribution.
Therefore each jar now also contains the version number in the name.
- Using Ant version lower than 1.6.x no longer works!
I decided to no longer support older ant versions since it is more trouble than it is worth.
I will remove some no longer working and thus unnecessary code to support old ant versions, and
also update the userguide to reflect that when I find the time for that.
- Using namespace name in a method name should now work again!
An element getter method of the following format: get[namespace]_[element]() threw
an exception complaining that the returned element did not match the getter.
Version 2.8 released!
XML Schema parser (used by xobgen and xsddoc):
- The top level <xsd:annotation><xsd:documentation>
tag was not seen unless the prefix was "xs". This was a dumbbug
of extracting the documentation before extracting the namespace
prefix used, where the prefix defaulted to "xs".
xobgen (interface generator):
- When extending objects that have their names mapped
the original unmapped names where used in the extends
declaration of the generated interface. This is now fixed.
Version 2.5 released!
- Version 2.4 released! (Version 2.2 and 2.3 were never released as file releases!).
- xobgen and xsddoc now works on Windows! I used "File.separator" in a getResource() path! The javadoc
(which I apparently never read!) clearly states that getResource() always uses '/' independent of
platform! The actual xob.jar library have been tested on Windows before, but never the generators.
- Now supports Ant 1.6.0 and above.
Ant 1.5.4 and below had a bug in the AntClassLoader, it failed to define the package of a class
when loading the class, causing getClass().getPackage() to return null even if the class is not
packageless. XOB has a point where it needs to know if an XOB interface belongs to a package or
not, which failed when XOB classes were loaded by Ants class loader. The workaround to this was
to let XOB provide its own class loader and rename XOBGenAntTask to XOBGenAntTaskReal and let a
new XOBGenAntTask wrap and load XOBAntTaskReal using the internal class loader.
Since version 1.6.0 of Ant the class loader bug has been fixed, and the XOB internal class loader
no longer needs to be used (and actually have a conflict with the new Ant class loader!). Therefore
XOBGenAntTaskReal and XSDDocAntTaskReal should be used for Ant 1.6.0 and above. XSDDocAntTaskReal
now detects if it is being run directly as an Ant task or if it is being wrapped, and handles both
- The type mappings done by xobgen when translating XML Schema types to XOB types are now done
using <xobhome>/lib/TypeMap.xml. These mappings can now easily be added to or modified.
- Not having found any more bugs in a while I decided to release version 2.1.
Version 2.1 contains the below mentioned bug fix plus a verification that
element names and interface names match when unmarshalling. It throws
XOBParseException on mismatch. Before it was possible to unmarshal a
wrong XML file without complaints during unmarshal.
- Bug fix: Getting nonexistent attribute (optional and not set) caused a NullPointerException.
In all my test cases I never thought of doing something that simple!! I will currently not
make a new release. Get the CVS version, it is simple to build. I will make a new release in
- Version 2.0 released.
I'm using strict and simple oldtime version numbering: Bug fixes bump the minor number,
new functions bump the major number.
This release contains several bug fixes that were discovered when using XOB in another
project with more complex XML files than those used by the examples. There are bug fixes
in all 4 jar files.
New feature: The possibility of choosing the interface names. You can call them anything
you want! When using the generator there is a "--map elementName objectName" option or
a "<map elementName="elementName" objectName="objectName"/> subtag
for <xobgen> that allows you to map XML element names to object names. See userguide
for more info.
- Version 1.1 released.
A simple, but important bug fix: marshalling of XML objects to XML now
does the standard encoding of the [<>&"'] characters.
- Version 1.0 released! This now feels complete. It now contains 4 jar files:
It also contains improved namespace handling. It is no longer necessary to
include namespace prefix in setter and getter names even though that is still
Please see the UserGuide for more information.
- The main jar, the one you need to include in your application if you
- This is an XML Schema parser suitable for code generation.
The next 2 jar files makes use of this one.
- Generates XOB interfaces from an XML Schema file. Also contains
an Ant task for Ant usage.
- Generates HTML documentation for an XML Schema file. Also contains
an Ant task for Ant usage.
- Version 0.5 released. I called this release 0.5 due to that it is
missing an XSD->Interface generator. It is however usable as is,
and I want to use this in another project. The major version number
wont reach 1 until the generator is done (and tested).
About testing: The example code doubles as test code and covers all features
of XOB. It is however the only testing that has been done so far.
- This is a very new project, that have just started. It will take a while before
there be anything useful available.