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;
}


Reply via email to