Hi Robert,
you are creating an XMLEntityResolver, but using the setEntityResolver
API that expects an EntityResolver interface; infact, you had to add a
cast to force the compiler in doing this illegal thing.
You should instead use the setXMLEntityResolver API, that accepts the
correct base interface. However, it's not available in the SAX2XMLReader
interface, and you will have to cast it down to the implementation class
((SAX2XMLReaderImpl*)pParser)->setXMLEntityResolver(&XmlEntityResolver);
Alberto
Il 15/04/2011 10:33, Robert Wermuth ha scritto:
Hi Alberto,
at first thanks for your fast answer. I am using stack objects, but I starts
the parsing in an child stackframe, so that the stackobjects should be valid
at parse-time. The program runs in debug build well, but in the release
build it crashes. I found out that it crashes at XMLString::replicate()
(called by RegxParser::parse()) at the memcpy()-function. The program don't
crashes if I remove my own entity resolver.
Here is some code of my program for you:
Here is my entity resolver:
class MyEntityResolver : public XMLEntityResolver
{
public:
virtual ~MyEntityResolver()
{
}
MyEntityResolver()
{
}
virtual InputSource *resolveEntity(XMLResourceIdentifier
*resourceIdentifier)
{
//this prozedure get fired one time, but all the pointers are invalid (I
made them public for reading them)
printf("BaseURI: 0x%08X\nLocator: 0x%08X\nNameSpace: 0x%08X\nPublicId:
0x%08X\nResourceIdentifierType: 0x%08X\n"
"SystemId: 0x%08X"
, (UINT) resourceIdentifier->fBaseURI, (UINT) resourceIdentifier->fLocator,
(UINT) resourceIdentifier->fNameSpace, (UINT) resourceIdentifier->fPublicId,
(UINT) resourceIdentifier->fResourceIdentifierType, (UINT)
resourceIdentifier->fSystemId);
return g_pMemBufSourceForDTD;
}
};
And here is the code for parsing the XML-file:
SAX2XMLReader* pParser = XMLReaderFactory::createXMLReader();
XMLPScanToken Token;
MyDocumentHandler XmlHandler;
MemoryManagerImpl MemManager;
void * pDestXMLData;
Grammar * pGrammar;
pDestXMLData = MemManager.allocate(p_nSize);
memcpy(pDestXMLData, p_pXMLData, p_nSize);
MemBufInputSource MemBufSource(
(const XMLByte *) pDestXMLData,
p_nSize,
"Fake sytem ID",
FALSE,
&MemManager);
pParser->setContentHandler(&XmlHandler);
MyErrorHandler XmlErrorHandler;
pParser->setErrorHandler(&XmlErrorHandler);
MyEntityResolver XmlEntityResolver;
pParser->setEntityResolver((EntityResolver *const)&XmlEntityResolver);
pGrammar = pParser->loadGrammar(
*g_pMemBufSourceForDTD,
Grammar::DTDGrammarType,
TRUE);
pParser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, TRUE);
pParser->setFeature(XMLUni::fgXercesSchemaFullChecking, TRUE);
pParser->setFeature(XMLUni::fgSAX2CoreValidation, TRUE);
pParser->setFeature(XMLUni::fgXercesSkipDTDValidation, FALSE);
pParser->setFeature(XMLUni::fgXercesLoadExternalDTD, TRUE);
pParser->setFeature(XMLUni::fgXercesDynamic, TRUE);
try
{
if(!pParser->parseFirst(MemBufSource, Token)) //Here is the crash!
{
goto ParseError;
}
while(pParser->parseNext(Token))
{
if(g_bParseError == TRUE)
{
MemManager.deallocate(pDestXMLData);
delete pParser;
return FALSE;
}
}
}
Is that all you need?
Greetings
Robert
2011/4/14 Alberto Massari<alberto.mass...@progress.com>
Hi Robert,
it's hard to tell what's wrong without seeing your code. I would guess you
are allocating an object on the stack that is destroyed before the parsing
take place...
Could you share the code you are using?
Alberto
Il 14/04/2011 17:56, Robert Wermuth ha scritto:
Hello,
I am using xerces 3.1.1 with the SAX2XMLReader. I use
pParser->setEntityResolver() to install my own entity resolver. I compile my
project with Visual Studio c++ 9.1 (using the static xerces libs). But in
the Release build my program crashes on pParser->parseFirst() when I set my
entity resolver.I tried to compile the example code shown there:
http://xerces.apache.org/xerces-c/apiDocs-3/classXMLEntityResolver.html. But
I get a compiler error (XMLResourceIdentifier::SystemId is not defined.). Is
there an error in the lib?
Greetings
Robert
.