⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sax2xercesparser.cpp

📁 java开源的企业总线.xmlBlaster
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*-----------------------------------------------------------------------------Name:      Sax2XercesParser.cppProject:   xmlBlaster.orgCopyright: xmlBlaster.org, see xmlBlaster-LICENSE fileComment:   Default handling of Sax callbacks-----------------------------------------------------------------------------*/#ifndef _UTIL_PARSER_SAX2XERCESPARSER_C#define _UTIL_PARSER_SAX2XERCESPARSER_C#if defined(XMLBLASTER_MSXML_PLUGIN)#  error Implement Microsoft XML parser for /DXMLBLASTER_MSXML_PLUGIN#else  // XMLBLASTER_XERCES_PLUGIN#if defined(_WIN32)  #pragma warning(disable:4786)#endif#include <util/parser/Sax2XercesParser.h>#include <xercesc/sax/SAXException.hpp>#include <xercesc/sax2/SAX2XMLReader.hpp>#include <xercesc/sax2/XMLReaderFactory.hpp>#include <xercesc/util/PlatformUtils.hpp>#include <xercesc/framework/MemBufInputSource.hpp>#include <util/XmlBlasterException.h>#include <util/Global.h>#include <util/lexical_cast.h>#include <iostream>//#include <cstdlib> //<stdlib.h>namespace org { namespace xmlBlaster { namespace util { namespace parser {using namespace std;static const int ENCODERBUFFERSIZE = 16*1024;Sax2Parser::Sax2Parser(org::xmlBlaster::util::Global& global, XmlHandlerBase *handler) :     I_Parser(handler), ME("Sax2Parser"), global_(global), log_(global.getLog("org.xmlBlaster.util.xml")),    xmlBlasterTranscoder_(0){   if (log_.call()) log_.trace(ME, "Creating new Sax2Parser");   //"UTF-8" is currently not supported with our std::string usage!   encoding_ = global_.getProperty().getStringProperty("xmlBlaster/encoding", "iso-8859-1");   XMLTransService::Codes resCode;   xmlBlasterTranscoder_ = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(encoding_.c_str(), resCode, ENCODERBUFFERSIZE);   if (resCode != 0/*XMLTransService::Codes::Ok*/) {      log_.error(ME, "Creation of XMLTranscoder with encoding='" + encoding_ + "' failed with error code " + lexical_cast<string>((int)resCode) +                     ". Please check your SAX parser setting '-xmlBlaster/encoding'");      throw XmlBlasterException(USER_CONFIGURATION, ME, "Creation of XMLTranscoder with encoding='" + encoding_ + "' failed with " + lexical_cast<string>((int)resCode));   }   else {      if (log_.trace()) log_.trace(ME, "Created XMLTranscoder res=" + lexical_cast<string>((int)resCode) + " with encoding=" + encoding_);   }}Sax2Parser::~Sax2Parser(){   delete xmlBlasterTranscoder_;}std::string Sax2Parser::usage() {   std::string text = string("");   //text += string("\n");   text += string("\nThe xerces SAX XML parser plugin configuration:");   text += string("\n   -xmlBlaster/encoding [iso-8859-1]");   text += string("\n                       The parser encoding to use for xmlBlaster specific QoS and key SAX parsing");   text += string("\n");   return text;}void Sax2Parser::init(const string &xmlLiteral) {   if (xmlLiteral.size() > 0) {      parse(xmlLiteral);   }}      /** * Does the actual parsing * @param xmlData Quality of service in XML notation */void Sax2Parser::parse(const string &xmlData) {   //if (log_.call()) log_.call(ME, "parse");   //if (log_.trace()) log_.trace(ME, string("parse content:'") + xmlData + string("'"));    SAX2XMLReader *parser = NULL;   //XMLCh* encodingHelper = NULL;   try {      parser = XMLReaderFactory::createXMLReader();      parser->setContentHandler(this);      parser->setErrorHandler(this);      parser->setLexicalHandler(this);      // "UTF-8"  "iso-8859-1"      //string xmlData1 = string("<?xml version=\"1.0\" encoding=\""+encoding_+"\"?>\n") + xmlData;      const string &xmlData1 = xmlData;      //log_.info(ME, "Parsing now: " + xmlData1);            MemBufInputSource inSource((const XMLByte*)xmlData1.c_str(), (unsigned int)(xmlData1.size()), "xmlBlaster", false);            XMLCh tempStr[100];      XMLString::transcode(encoding_.c_str(), tempStr, 99);      inSource.setEncoding(tempStr);      //encodingHelper = XMLString::transcode(encoding.c_str());      //inSource.setEncoding(encodingHelper);      //Sax2Parser::releaseXMLCh(&encodingHelper);      parser->parse(inSource);      delete parser;   }   catch (StopParseException&) {      // If it does not work, it could be wrapped into SAXParseException      log_.error(ME, string("StopParseException: ") +                              "Parsing execution stopped half the way ");      if (log_.trace()) {         string help = XmlBlasterException::getStackTrace();         log_.plain(ME, help);      }      delete parser; // just in case it did not       return;   }   catch (XmlBlasterException& ex) {      throw ex;   }   catch (SAXParseException &err) {      string loc = getLocationString(err) + string(": ") + getStringValue(err.getMessage());      delete parser;      throw XmlBlasterException(USER_ILLEGALARGUMENT, ME + "::parse", string("SAXParseException") + loc);   }   catch (SAXNotRecognizedException &err) {      string msg = getStringValue(err.getMessage());      delete parser;      throw XmlBlasterException(USER_ILLEGALARGUMENT, ME + "::parse", string("SAXNotRecognizedException: ") + msg);        }   catch (SAXNotSupportedException &err) {      string msg = getStringValue(err.getMessage());      delete parser;      throw XmlBlasterException(USER_ILLEGALARGUMENT, ME + "::parse", string("SAXNotSupportedException: ") + msg);        }   catch (const XMLException &err) {      string msg = getStringValue(err.getMessage());      delete parser;      throw XmlBlasterException(USER_ILLEGALARGUMENT, ME + "::parse", string("XMLException: ") + msg);   }   catch (SAXException &err) {      string msg = getStringValue(err.getMessage());      delete parser;      throw XmlBlasterException(USER_ILLEGALARGUMENT, ME + "::parse", string("SAXException: ") + msg);   }   catch (const std::exception& err) { // catches all of bad_alloc, bad_cast, runtime_error, ...      string msg = err.what() + string(": ") + xmlData;      delete parser;      throw XmlBlasterException(USER_ILLEGALARGUMENT, ME + "::parse", string("std:exception: ") + msg);   }   catch (const string& err) {     string msg = err;     delete parser;     throw XmlBlasterException(INTERNAL_UNKNOWN, ME + "::parse", string("string exception. message:") + err + ": " + xmlData);   }   catch (const char* err) {     string msg = err;     delete parser;     throw XmlBlasterException(INTERNAL_UNKNOWN, ME + "::parse", string("char *exception. message:") + err + ": " + xmlData);   }   catch (...) {     delete parser;     throw XmlBlasterException(INTERNAL_UNKNOWN, ME + "::parse", string("Unknown parse exception: ") + xmlData);   }}/** Receive notification of the end of the document. */void Sax2Parser::endDocument() {   if (log_.call()) log_.call(ME, string("endDocument"));   handler_->endDocument();}/** Receive notification of the end of an element. */void Sax2Parser::endElement(const XMLCh *const /*uri*/, const XMLCh *const /*localname*/, const XMLCh *const qname){   //if (log_.call()) log_.call(ME, string("endElement"));   handler_->endElement(getStringValue(qname));}/** Receive notification of the beginning of the document. */void Sax2Parser::startDocument(){   //if (log_.call()) log_.call(ME, string("startDocument"));   handler_->startDocument();}/** Receive notification of the start of an element. */void Sax2Parser::startElement(const XMLCh *const /*uri*/, const XMLCh *const /*localname*/, const XMLCh *const qname, const Attributes &attrs){   //if (log_.call()) log_.call(ME, "startElement <" + name + ">");   AttributeMap tmpMap;   handler_->startElement(getStringValue(qname), getAttributeMap(tmpMap, attrs));}/** Receive notification of the end of a CDATA section. */void Sax2Parser::endCDATA(){   //if (log_.call()) log_.call(ME, string("endCDATA"));   handler_->endCDATA();}/** Receive notification of the start of a CDATA section. */void Sax2Parser::startCDATA(){   //if (log_.call()) log_.call(ME, string("startCDATA"));   handler_->startCDATA();}/** Receive notification of character data inside an element. */void Sax2Parser::characters(const XMLCh *const chars, const unsigned int length){   //if (log_.call()) log_.call(ME, string("characters"));   string tmp;   bool doTrim = false;   tmp.assign(getStringValue(chars, doTrim), 0, length);   handler_->characters(tmp);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -