cargilld 2004/09/27 21:42:21 Modified: c/samples/SCMPrint SCMPrint.cpp Log: Update sample to use an error handler and only generate xsmodel when a schema document has been loaded successfully. Revision Changes Path 1.5 +107 -16 xml-xerces/c/samples/SCMPrint/SCMPrint.cpp Index: SCMPrint.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/SCMPrint/SCMPrint.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- SCMPrint.cpp 8 Sep 2004 13:55:34 -0000 1.4 +++ SCMPrint.cpp 28 Sep 2004 04:42:21 -0000 1.5 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.5 2004/09/28 04:42:21 cargilld + * Update sample to use an error handler and only generate xsmodel when a schema document has been loaded successfully. + * * Revision 1.4 2004/09/08 13:55:34 peiyongz * Apache License Version 2.0 * @@ -54,6 +57,7 @@ #include <stdlib.h> #include <string.h> #include <xercesc/util/OutOfMemoryException.hpp> +#include <xercesc/sax2/DefaultHandler.hpp> XERCES_CPP_NAMESPACE_USE @@ -116,6 +120,73 @@ return target; } +class SCMPrintHandler : public DefaultHandler +{ +public: + // ----------------------------------------------------------------------- + // Constructors and Destructor + // ----------------------------------------------------------------------- + SCMPrintHandler(); + ~SCMPrintHandler(); + + bool getSawErrors() const + { + return fSawErrors; + } + + void warning(const SAXParseException& exc); + void error(const SAXParseException& exc); + void fatalError(const SAXParseException& exc); + void resetErrors(); + + +private: + bool fSawErrors; +}; + +SCMPrintHandler::SCMPrintHandler() : + fSawErrors(false) +{ +} + +SCMPrintHandler::~SCMPrintHandler() +{ +} + +// --------------------------------------------------------------------------- +// SCMPrintHandler: Overrides of the SAX ErrorHandler interface +// --------------------------------------------------------------------------- +void SCMPrintHandler::error(const SAXParseException& e) +{ + fSawErrors = true; + XERCES_STD_QUALIFIER cerr << "\nError at file " << StrX(e.getSystemId()) + << ", line " << e.getLineNumber() + << ", char " << e.getColumnNumber() + << "\n Message: " << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl; +} + +void SCMPrintHandler::fatalError(const SAXParseException& e) +{ + fSawErrors = true; + XERCES_STD_QUALIFIER cerr << "\nFatal Error at file " << StrX(e.getSystemId()) + << ", line " << e.getLineNumber() + << ", char " << e.getColumnNumber() + << "\n Message: " << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl; +} + +void SCMPrintHandler::warning(const SAXParseException& e) +{ + XERCES_STD_QUALIFIER cerr << "\nWarning at file " << StrX(e.getSystemId()) + << ", line " << e.getLineNumber() + << ", char " << e.getColumnNumber() + << "\n Message: " << StrX(e.getMessage()) << XERCES_STD_QUALIFIER endl; +} + +void SCMPrintHandler::resetErrors() +{ + fSawErrors = false; +} + // --------------------------------------------------------------------------- // Local helper methods // --------------------------------------------------------------------------- @@ -219,9 +290,13 @@ parser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, false); parser->setFeature(XMLUni::fgSAX2CoreValidation, true); parser->setFeature(XMLUni::fgXercesDynamic, true); + parser->setProperty(XMLUni::fgXercesScannerName, (void *)XMLUni::fgSGXMLScanner); + SCMPrintHandler handler; + parser->setErrorHandler(&handler); bool more = true; + bool parsedOneSchemaOkay = false; XERCES_STD_QUALIFIER ifstream fin; // the input is a list file @@ -234,7 +309,7 @@ } while (more) - { + { char fURI[1000]; //initialize the array to zeros memset(fURI,0,sizeof(fURI)); @@ -258,32 +333,48 @@ } parser->loadGrammar(xsdFile, Grammar::SchemaGrammarType, true); + if (handler.getSawErrors()) + { + handler.resetErrors(); + } + else + { + parsedOneSchemaOkay = true; + } } - XERCES_STD_QUALIFIER cout << "********** Printing out information from Schema **********" << "\n\n"; + if (parsedOneSchemaOkay) + { + XERCES_STD_QUALIFIER cout << "********** Printing out information from Schema **********" << "\n\n"; - XSModel *xsModel = grammarPool->getXSModel(); - if (xsModel) - { - StringList *namespaces = xsModel->getNamespaces(); - for (unsigned i = 0; i < namespaces->size(); i++) { + XSModel *xsModel = grammarPool->getXSModel(); + if (xsModel) + { + StringList *namespaces = xsModel->getNamespaces(); + for (unsigned i = 0; i < namespaces->size(); i++) { - XERCES_STD_QUALIFIER cout << "Processing Namespace: "; - const XMLCh *nameSpace = namespaces->elementAt(i); - if (nameSpace && (XMLString::stringLen(nameSpace)>0)) - XERCES_STD_QUALIFIER cout << StrX(nameSpace); - XERCES_STD_QUALIFIER cout << "\n============================================" << XERCES_STD_QUALIFIER endl << XERCES_STD_QUALIFIER endl; + XERCES_STD_QUALIFIER cout << "Processing Namespace: "; + const XMLCh *nameSpace = namespaces->elementAt(i); + if (nameSpace && (XMLString::stringLen(nameSpace)>0)) + XERCES_STD_QUALIFIER cout << StrX(nameSpace); + XERCES_STD_QUALIFIER cout << "\n============================================" << XERCES_STD_QUALIFIER endl << XERCES_STD_QUALIFIER endl; - processElements(xsModel->getComponentsByNamespace(XSConstants::ELEMENT_DECLARATION, + processElements(xsModel->getComponentsByNamespace(XSConstants::ELEMENT_DECLARATION, nameSpace)); - processTypeDefinitions(xsModel->getComponentsByNamespace(XSConstants::TYPE_DEFINITION, + processTypeDefinitions(xsModel->getComponentsByNamespace(XSConstants::TYPE_DEFINITION, nameSpace)); - } + } + } + else + { + XERCES_STD_QUALIFIER cout << "No XSModel to print" << "\n\n"; + } } else { - XERCES_STD_QUALIFIER cout << "No XSModel to print" << "\n\n"; + XERCES_STD_QUALIFIER cout << "Did not parse a schema document cleanly so not printing Schema for Schema XSModel information"; } + XERCES_STD_QUALIFIER cout << XERCES_STD_QUALIFIER endl; } catch (const OutOfMemoryException&)
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]