You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-users@xerces.apache.org by Ben Griffin <be...@redsnapper.net> on 2009/03/28 22:17:25 UTC

Help! DTD Grammar not being cached ...

I've really tried to find out what I am doing wrong here.
Basically, I am using my own DOMLSResourceResolver to use a local copy  
of XHTML 1.1 Strict DTD for many hundreds of XHTML documents.
But the parser seems to be refusing to cache it, or find it - so it is  
asking for a new copy for each document.

I am sure I am doing something wrong - but what I noticed was that  
srcToFill->getSystemId() is not returning the SystemID that I set.

Here are the parser settings I am using.
dc->setParameter(XMLUni::fgDOMResourceResolver,myResourceHandler);
	
dc->setParameter(XMLUni::fgXercesValidationErrorAsFatal, false);		
dc->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true);		
dc->setParameter(XMLUni::fgXercesUseCachedGrammarInParse, true);		
dc->setParameter(XMLUni::fgXercesSchema, true);	
dc->setParameter(XMLUni::fgXercesSchemaFullChecking, true);	
dc->setParameter(XMLUni::fgXercesContinueAfterFatalError, true);		
dc->setParameter(XMLUni::fgXercesCacheGrammarFromParse, true);		
dc->setParameter(XMLUni::fgDOMElementContentWhitespace, false); 	
dc->setParameter(XMLUni::fgDOMNamespaces, true);
dc->setParameter(XMLUni::fgDOMDatatypeNormalization, true);
dc->setParameter(XMLUni::fgXercesLoadExternalDTD, false);
dc->setParameter(XMLUni::fgXercesIgnoreCachedDTD, false);
dc->setParameter(XMLUni::fgDOMValidateIfSchema, true);

My call traces were as follows:

void TraverseSchema::preprocessImport(const DOMElement* const elem)

         InputSource* srcToFill =  
resolveSchemaLocation 
(schemaLocation,XMLResourceIdentifier::SchemaImport, nameSpace);

(which goes to)

InputSource* TraverseSchema::resolveSchemaLocation(const XMLCh* const  
loc,
                                 const  
XMLResourceIdentifier::ResourceIdentifierType resourceIdentitiferType,
                                 const XMLCh* const nameSpace)


(which goes to)

  InputSource* DOMLSParserImpl::resolveEntity( XMLResourceIdentifier*  
resourceIdentifier ) {
      if (fEntityResolver) {
         DOMLSInput* is = fEntityResolver- 
 > 
resolveResource 
(resourceIdentifier 
 >getResourceIdentifierType()==XMLResourceIdentifier::ExternalEntity? 
XMLUni::fgDOMDTDType:XMLUni::fgDOMXMLSchemaType,
                  resourceIdentifier->getNameSpace(),
                  resourceIdentifier->getPublicId(),
                  resourceIdentifier->getSystemId(),
                 resourceIdentifier->getBaseURI());
         if (is)
             return new (getMemoryManager()) Wrapper4DOMLSInput(is,  
fEntityResolver, true, getMemoryManager());
     }
     if (fXMLEntityResolver) {
         return(fXMLEntityResolver->resolveEntity(resourceIdentifier));
     }
     return 0;
}

//DOMLSParserImpl::resolveEntity calls my resolveResource which I have  
added using XMLUni::fgDOMResourceResolver
//where I construct a new DOMLSInput with createLSInput //which  
contains, in this case, a local copy of XHTML 1.1 Strict DTD.
[...]
	DOMLSInput* srcToFill = ((DOMImplementationLS*)Manager::parser()- 
 >impl)->createLSInput();		
	srcToFill->setStringData(my_dtd_xhtml1_grammar);  //This DTD is  
already XMLCh encoded, and is definitely correct.
	srcToFill->setEncoding(XMLUni::fgXMLChEncodingString);
	srcToFill->setPublicId(publicId);
	srcToFill->setSystemId(systemId);
	return srcToFill;
[...]

The returned LSInput bubbles back upt to preprocessImport,

TraverseSchema, Line 830:
     const XMLCh* importURL = srcToFill->getSystemId();  <<-- returns  
NULL even though I set it in the DOMLSInput.