Introduction

We have a DTD file and want to create the corresponding Java classes. Nobody wants to write the code by hand, therefore we create them by the use of the build in XML binding compiler xjc.

Java XML Binding Compiler

Below you can see the usage of the xjc command:

Usage: xjc [-options ...] <schema_file/URL/dir> ... [-b <bindinfo>] ...
Options:
 -nv                  : do not perform strict validation of the input schema(s)
 -extension           : allow vendor extensions - do not strictly follow the
                        Compatibility 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 <file>: set the proxy string (same format as above).
 -classpath <arg>     : specify where to find user class files
 -catalog <file>      : specify catalog files to resolve external entity references
                        support 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          : behave like XJC 2.0 and generate code that doesnt use any 2.1 features.
 -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

Source Oracle

As you can see there is a command line parameter -dtd with which we can specify the input.

Example DTD

Lets take a DTD file like the one below and save it as example.dtd.

<!ELEMENT people_list (person)*>
<!ELEMENT person (name, birthdate?, gender?, socialsecuritynumber?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT birthdate (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ELEMENT socialsecuritynumber (#PCDATA)>

Example DTD taken from wikipedia

Creating the Java classes from the DTD:

xjc -dtd -d targetDirectoy example.dtd

In our specific case it will look similar to this:

xjc -dtd -d /Users/myUser/Development/Java/DTDExample/ example.dtd
parsing a schema...
compiling a schema...
generated/ObjectFactory.java
generated/PeopleList.java
generated/Person.java
Laptop:DTDExample myUser$ cd generated
Laptop:generated myUser$ ls
ObjectFactory.java	PeopleList.java		Person.java

Additionally you can also specify the package with -p your.package. This package will be automatically inserted into the Java classes.