Hi all,
I am trying to redirect validation to external DTD ot XSD file depends on
the input.
In case of schema parser still expects DTD.
What am I doing wrong in the following code?
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////
HRESULT XMLValidator::Valid(const LPCTSTR xmlFileName, const LPCTSTR
validationFileName)
{
SAXParser* parser = new SAXParser;
HRESULT hr = S_OK;
CString val = validationFileName;
val.TrimLeft();
val.TrimRight();
RedirectHandler handler(validationFileName);
parser->setDocumentHandler(&handler);
parser->setErrorHandler(&handler);
if( val.IsEmpty() ) {
parser->setLoadExternalDTD(false);
parser->setValidationScheme(SAXParser::Val_Auto);
parser->setDoSchema(false);
parser->setValidationSchemaFullChecking(false);
}
else if ( val.Mid(val.ReverseFind('.')+1).CompareNoCase("DTD") == 0 ) {
parser->setEntityResolver(&handler);
parser->setLoadExternalDTD(true);
parser->setDoSchema(false);
parser->setValidationSchemaFullChecking(false);
}
else if ( val.Mid(val.ReverseFind('.')+1).CompareNoCase("XSD") == 0 ) {
parser->setEntityResolver(&handler);
parser->setLoadExternalDTD(false);
parser->setDoSchema(true);
parser->setValidationScheme(SAXParser::Val_Always);
parser->setValidationSchemaFullChecking(true);
}
int errorCount = 0;
try
{
parser->parse(xmlFileName);
errorCount = parser->getErrorCount();
}
catch (const XMLException& e)
{
CString error;
error.Format("\nError during parsing: '%s'\nException message is:
'%s'\n",
xmlFileName, StrX(e.getMessage()) );
m_szError += error;
hr = E_FAIL;
}
if (errorCount) {
hr = E_FAIL;
}
if( FAILED( hr ) )
m_szError += handler.GetError();
delete parser;
return hr;
}
//////////////////////////////////////////
// -----------------------------------------------------------------------
// Handlers for the SAX EntityResolver interface
// -----------------------------------------------------------------------
InputSource* RedirectHandler::resolveEntity(const XMLCh* const publicId
, const XMLCh* const
systemId)
{
InputSource* is = NULL;
if( !m_szValidationFile.IsEmpty() ) {
XMLCh* text = XMLString::transcode((LPCTSTR)m_szValidationFile);
is = new LocalFileInputSource(text);
delete [] text; text = NULL;
}
return is;
}
///////////////////////////////////////////////////
Thanks,
Igor Shtilkind
Software Engineer
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]