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