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]

Reply via email to