10/30/2003

Welcome to XmlBeans!

Apache XMLBeans is an effort undergoing incubation at the 
Apache Software Foundation (ASF), sponsored by the XML project. 
Incubation is required of all newly accepted projects until a 
further review indicates that the infrastructure, communications, 
and decision making process have stabilized in a manner consistent 
with other successful ASF projects. While incubation status is not 
necessarily a reflection of the completeness or stability of the 
code, it does indicate that the project has yet to be fully 
endorsed by the ASF. 


If you've come here to learn more about XmlBeans, here are a few
starting points:




(1) Docs
    
If you "ant docs" then you can get javadocs built for a bunch
of our stuff. In particular, look at the org.apache.xmlbeans package,
starting with XmlObject and XmlCursor.

Not a lot is doc'ed yet, so you may want to check out the samples
to learn more - we really need a little tutorial.

In the mean time, if you've got more questions, please post your questions
to xmlbeans-user@xml.apache.org (you need to subscribe prior to posting,
by sending a blank mail to xmlbeans-user-subscribe@xml.apache.org).



(2) Build

The default target, aka "ant default", builds everything you need
to test and run. 


Other targets:
  ant build: builds public jars that are used for compiling other bits of wlw
  ant deploy: builds xbean.jar too
  ant drt: builds drt tests too
  ant bootstrap: builds xbean.jar, then builds it again using itself.


Interface JARs:

xmlpublic.jar - the XBeans public interfaces, for use by our users.
wlxbean.jar - interfaces specific to the IDE/runtime, not for use by others.


Implementation JARs:

xbean.jar - the whole xbean.jar - everything you need to run. When this
 is on your classpath, you don't need xmlpublic.jar or wlxbean.jar


Testing JARs:

drt.jar - our DRT
enumtest.jar, easypo.jar, nameworld.jar, xstypes.jar - sample XBean JARs.


Other JARs:

oldxbean.jar - a fully built previous-version of xbean.jar, used for
  bootstrapping, since xbeans are used in building xbean.jar itself.





(3) Running

There are a few ways you can run.  There is some pretty plain-jane
JUnit testing code checked into xbean\test\src\drt that you can
use to see how to exercise our functionality. (The tests in that
directory are our Developer Regression Tests.)

You can run the drt using xbean\bin\drt[.sh|.cmd].

Another tool that you can use is "scomp", the XBean schema
compiler. The scomp script is at xbean\bin\scomp[.sh|.cmd].

To run scomp, just point it at an XSD file or a directory full
of XSD files, and it will produce an output .jar with all your
types.

Since scomp jars up its results, it can be hard to see what it
is doing. But if you use the "-src mydir" option with scomp,
you can specify a directory into which it will dump .java source
code files that correspond to the java types it is generating.

Finally, there is a utility called "dumpxsb". If you unjar
a built xbean jar, you'll notice a bunch of .xsb files scattered
about. Each one of these files represents a schema type, attribute,
or element definition, and you can use "dumpxsb" to see the
contents.

