Hi Dale,
EXT-Pennington, Dale K <[EMAIL PROTECTED]> writes:
> Now the method I envision would work as follows :
> 1) Do a non-validating pass with no schema specified.
> 2) Get the root element from the first pass, use it to determine the
> actual message type and reparse/validate with the appropriate schema
> specified.
I think there is a better way to handle this. From your description
I gather that you have different root element names for different
messages. In this case you can load and cache the schemas for all
possible message types. When the parser tries to validate an XML
instance it will look for the corresponding root element grammar
in the cache and use that to validate.
The code for caching schemas looks along these lines:
const XMLCh ls_id [] = {chLatin_L, chLatin_S, chNull};
// Get an implementation of the Load-Store (LS) interface.
//
DOMImplementation* impl (
DOMImplementationRegistry::getDOMImplementation (ls_id));
// Create a DOMBuilder.
//
xml::dom::auto_ptr<DOMBuilder> parser (
impl->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0));
// Discard comment nodes in the document.
//
parser->setFeature (XMLUni::fgDOMComments, false);
// Enable datatype normalization.
//
parser->setFeature (XMLUni::fgDOMDatatypeNormalization, true);
// Do not create EntityReference nodes in the DOM tree.
//
parser->setFeature (XMLUni::fgDOMEntities, false);
// Perform namespace processing.
//
parser->setFeature (XMLUni::fgDOMNamespaces, true);
// Do not include ignorable whitespace in the DOM tree.
//
parser->setFeature (XMLUni::fgDOMWhitespaceInElementContent, false);
// Enable validation.
//
parser->setFeature (XMLUni::fgDOMValidation, true);
parser->setFeature (XMLUni::fgXercesSchema, true);
parser->setFeature (XMLUni::fgXercesSchemaFullChecking, false);
// Initialize the schema cache.
//
parser->loadGrammar ("library.xsd", Grammar::SchemaGrammarType, true);
parser->setFeature (XMLUni::fgXercesUseCachedGrammarInParse, true);
It is taken from one of our examples and uses our dom::auto_ptr to
simplify memory management but the overall idea is the same even if
you don't use it.
Boris
--
Boris Kolpackov
Code Synthesis Tools CC
http://www.codesynthesis.com
Open-Source, Cross-Platform C++ XML Data Binding