The Xerces’ Grammar Preparser and XSModel classes work very well for me,
but I have come upon a bit of a snag having to do with the GrammarPool. It is my understanding that a type
definition once placed in a given preparser’s grammar pool, will be used by
that preparser to resolve any references to that type (i.e.: includes will not
be loaded). I believe this happens in practice. As of today, my code opens an xml schema definition using
getResourceAsStream() and wraps the stream like so: new XMLInputSource(null,
null, null, <stream>, null).
Xerces threw an error originally since it couldn’t find any of the
includes (which supply my data types - the includes are located in the jar file
in the same directory/package as the main xsd file). At this point, I decided to preparse all the include files before parsing
the main xsd, thus placing all the data type definitions in the preparser’s
grammar pool. When I tried this,
Xerces threw no exceptions, and I was able to acquire an XSModel from the grammar. The problem is the XSModel doesn’t work. model.getComponents(XSConstants.ELEMENT_DECLARATION);
returns null. When I place all the xsds in “user.dir” they are loaded and resolve
properly. This isn’t a viable
solution, however. Our goal is to read
and write schemas to and from a database.
I have tried to test this architecture by limiting myself to streams,
which I feel would be a logical “bridge” from a database column to a preparser. There may be other ways to skin this
cat, but to my knowledge this should work. What could be causing the Grammar Preparser to fail quietly? Is there a debug flag I can set in
order to get more information?
Would I be able to write a plug-in “loader” to resolve the includes
myself? Thanks in advance, Dean Des Rosiers P.S. I’d also like to use schema
annotations. I understand they
haven’t been implemented yet in Xerces.
Is this planned for any specific release? |