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/30 20:06:13 UTC

DTD not being cached by DOMLSParser?

Here is code to load up a DTD into an XMLGrammarPool for a  
DOMLSParser. (on xercesc 3.01)
I am getting the result "Excellent! No Way, Dude!"
Which implies that the grammar was loaded and cached, but parser- 
 >getGrammar(nskey) is returning NULL.

Am I doing something stupid?
Should I report a bug?

	Best regards
	Ben.


#include <iostream>
#include <xercesc/framework/XMLGrammarPoolImpl.hpp>
#include <xercesc/validators/common/Grammar.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XercesDefs.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMImplementationLS.hpp>
#include <xercesc/dom/DOMImplementationRegistry.hpp>
#include <xercesc/dom/DOMLSParser.hpp>
#include <xercesc/framework/MemBufFormatTarget.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/util/XMLEntityResolver.hpp>

using namespace xercesc;

int main(int argc, char *argv[]) {
	XMLPlatformUtils::Initialize();
	if ( true ) {
		const XMLCh ls[] = {'L','S',chNull};
		const XMLCh dtdnm[] ={'h','e','l','l','o','.','d','t','d',chNull};
		const std::string hwdtd="<!ELEMENT greeting (#PCDATA)>";
//		const std::string hwxml="<greeting>Hello, world!</greeting>"; // 
example file - not used.
		
		XMLGrammarPoolImpl *newgrpool = new  
XMLGrammarPoolImpl(XMLPlatformUtils::fgMemoryManager);
		xercesc::DOMImplementation *impl =  
DOMImplementationRegistry::getDOMImplementation(ls);
		xercesc::DOMLSParser* parser = ((DOMImplementationLS*)impl)- 
 >createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, NULL,  
XMLPlatformUtils::fgMemoryManager,newgrpool);
		
		Grammar* grammar = NULL;
		const XMLCh* nskey = dtdnm;
		
		MemBufInputSource* mem = new MemBufInputSource((XMLByte*) 
(hwdtd.c_str()),hwdtd.size(),nskey);
		DOMLSInput* grmi = ((DOMImplementationLS*)impl)->createLSInput();	
		grmi->setByteStream(mem);
		grmi->setEncoding(XMLUni::fgUTF8EncodingString); //This must be done.
		grmi->setSystemId(nskey); //not sure this is necessary.
		
		DOMConfiguration* dc = parser->getDomConfig();
		dc->setParameter(XMLUni::fgXercesValidationErrorAsFatal, false);		
		dc->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true);	
		dc->setParameter(XMLUni::fgXercesCacheGrammarFromParse, true);
		dc->setParameter(XMLUni::fgXercesUseCachedGrammarInParse, true);		
		dc->setParameter(XMLUni::fgXercesSchema, true);	
		dc->setParameter(XMLUni::fgXercesContinueAfterFatalError, 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);
		
		grammar = parser->loadGrammar(grmi, Grammar::DTDGrammarType, false);
		if  (newgrpool->cacheGrammar(grammar)) {
			std::cout << "Excellent! ";
			Grammar* grm = parser->getGrammar(nskey);
			if ( grm != NULL ) {
				std::cout << " Yes Way, Dude!";
			} else {
				std::cout << "No Way, Dude!";
			}
		} else {
			std::cout << "Bogus!";
		}
		parser->release();
	}
	
	XMLPlatformUtils::Terminate();
	return 0;
}