[
http://issues.apache.org/jira/browse/XERCESC-1518?page=comments#action_12332427
]
Puyoman commented on XERCESC-1518:
----------------------------------
My source code follows:
*****************************************************
#include "stdafx.h"
#include <Include/PlatformDefinitions.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
#include <stdio.h>
#include <string.h>
XERCES_CPP_NAMESPACE_USE
class DOMTreeErrorReporter : public ErrorHandler
{
public:
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
DOMTreeErrorReporter() :
fSawErrors(false)
{
err = "";
}
~DOMTreeErrorReporter()
{
}
// -----------------------------------------------------------------------
// Implementation of the error handler interface
// -----------------------------------------------------------------------
void warning(const SAXParseException& toCatch);
void error(const SAXParseException& toCatch);
void fatalError(const SAXParseException& toCatch);
void resetErrors();
// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
bool getSawErrors() const;
bool fSawErrors;
CString err;
};
inline bool DOMTreeErrorReporter::getSawErrors() const
{
return fSawErrors;
}
void DOMTreeErrorReporter::warning(const SAXParseException&)
{
//
// Ignore all warnings.
//
}
void DOMTreeErrorReporter::error(const SAXParseException& toCatch)
{
fSawErrors = true;
char* mes1 = XMLString::transcode(toCatch.getSystemId());
char* mes2 = XMLString::transcode(toCatch.getMessage());
char buf[20];
_ltoa(toCatch.getColumnNumber(),buf,10);
char* mes3 = (char*)XMLString::transcode(buf);
_ltoa(toCatch.getLineNumber(),buf,10);
char* mes4 = (char*)XMLString::transcode(buf);
err += "Error at file \"";
err += mes1;
err += "\", line ";
err += mes4;
err += ", column ";
err += mes3;
err += "\n Message: ";
err += mes2;
if(mes1)delete mes1;
if(mes2)delete mes2;
if(mes3)delete mes3;
if(mes4)delete mes4;
}
void DOMTreeErrorReporter::fatalError(const SAXParseException& toCatch)
{
fSawErrors = true;
char* mes1 = XMLString::transcode(toCatch.getSystemId());
char* mes2 = XMLString::transcode(toCatch.getMessage());
char buf[20];
_ltoa(toCatch.getColumnNumber(),buf,10);
char* mes3 = (char*)XMLString::transcode(buf);
_ltoa(toCatch.getLineNumber(),buf,10);
char* mes4 = (char*)XMLString::transcode(buf);
err += "Fatal Error at file \"";
err += mes1;
err += "\", line ";
err += mes4;
err += ", column ";
err += mes3;
err += "\n Message: ";
err += mes2;
if(mes1)delete mes1;
if(mes2)delete mes2;
if(mes3)delete mes3;
if(mes4)delete mes4;
}
void DOMTreeErrorReporter::resetErrors()
{
fSawErrors = false;
}
int parse (const char* xmlFile, CString& errmsg)
{
char* message = NULL;
try
{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch)
{
char*message = XMLString::transcode(toCatch.getMessage());
errmsg = message;
XMLString::release(&message);
return -1;
}
XercesDOMParser* parser = new XercesDOMParser();
//parser->setValidationScheme(XercesDOMParser::Val_Always); //
optional.
parser->setDoNamespaces(true); // optional
//parser->setValidationSchemaFullChecking(true);
//parser->setValidationConstraintFatal(true);
parser->setDoValidation(true);
//parser->setDoSchema(true);
//parser->setExitOnFirstFatalError(true);
//parser->setCreateEntityReferenceNodes(true);
//parser->setExternalSchemaLocation("//test/xalan/Release/mem-pte2.dtd"
/*"C:/test/xalan/Release/mathml2.dtd "
"C:/test/xalan/Release/soextblx.dtd "
"C:/test/xalan/Release/wipo.ent");*/
//parser->setExternalNoNamespaceSchemaLocation("//test/xalan/Release/mem-pte2.dtd");
//ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
//DOMTreeErrorReporter *errReporter = new DOMTreeErrorReporter();
//parser->setErrorHandler(errReporter);
//
// Parse the XML file, catching any XML exceptions that might propogate
// out of it.
//
bool errorsOccured = false;
try
{
parser->parse(xmlFile);
}
catch (const OutOfMemoryException&)
{
//XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" <<
XERCES_STD_QUALIFIER endl;
errmsg = "OutOfMemoryException\n";
errorsOccured = true;
}
catch (const XMLException& e)
{
//XERCES_STD_QUALIFIER cerr << "An error occurred during
parsing\n Message: "
message = XMLString::transcode(e.getMessage());
errmsg = message;
XMLString::release(&message);
errorsOccured = true;
}
catch (const DOMException& e)
{
const unsigned int maxChars = 2047;
XMLCh errText[maxChars + 1];
if (DOMImplementation::loadDOMExceptionMsg(e.code, errText,
maxChars))
{
message = XMLString::transcode(errText);
errmsg = message;
XMLString::release(&message);
}
errorsOccured = true;
}
catch (...)
{
//XERCES_STD_QUALIFIER cerr << "An error occurred during
parsing\n " << XERCES_STD_QUALIFIER endl;
errmsg = "An error occurred during parsing\n";
errorsOccured = true;
}
XMLString::release(&message);
delete parser;
XMLPlatformUtils::Terminate();
return(errorsOccured ? -1 : 0);
}
*****************************************************
I only call this function for parsing.
Whenever parsing one xml file, this function is called.
i)Adding include directories for compiling:
xerces-c-src_2_7_0\src
"ICU 3.4\include"
xml-xalan\c\src
ii)Adding linked libraries:
xerces-c-src_2_7_0\Build\Win32\VC7\release\xerces-c_2.lib
xerces-c-src_2_7_0\Build\Win32\VC7\release\xerces-depdom_2.lib
xml-xalan\c\Build\Win32\VC6\release\Xalan-C_1.lib
xml-xalan\c\Build\Win32\VC6\release\Harness_1.lib
"ICU 3.4\lib\icuuc.lib"
> Always General Exception Error when being called from MFC application
> ---------------------------------------------------------------------
>
> Key: XERCESC-1518
> URL: http://issues.apache.org/jira/browse/XERCESC-1518
> Project: Xerces-C++
> Type: Bug
> Components: Validating Parser (DTD)
> Versions: 2.7.0
> Environment: OS:windows XP Pro sp2
> compiler: VC++ 7.0 2002
> memory:512MB
> Xerces version:2.7.0
> Xalan version: 1.9
> ICU version:3.4
> Reporter: Puyoman
> Priority: Critical
>
> I built Xerces+ICU and the parsing MFC application.
> When my application window closed and end to ExitInstance(), general
> protection
> error happened (read address:0xC0000005 place:0x00000000).
> In other case, if application don't call parse functions, these errors don't
> happen.
> Its parse is validating parse and DOM creating.
> So much exception is generated:
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0012263c
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x00123460
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011ead4
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011eb98
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011f8f8
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011f9bc
> Microsoft C++ exception: xercesc_2_7::EndOfEntityException @ 0x0011e8e4
> Does xerces (especially, debugging version) consume a large amount of
> heap areas?
> Xerces destroys even the area of MFC and the application program.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]