xmlBase::XmlParser Class Reference

#include <XmlParser.h>

List of all members.

Public Member Functions

 XmlParser (bool throwErrors=false)
void doSchema (bool doit)
 Call this method to turn on schema processing (else it's off).
 ~XmlParser ()
DOMDocument * parse (const char *const filename, const std::string &docType=std::string(""))
 Parse an xml file, returning document node if successful.
DOMDocument * parse (const std::string &buffer, const std::string &docType=std::string(""))
 Parse an xml file as a string, returning document node if successful.
void reset ()

Private Attributes

XercesDOMParser * m_parser
 Xerces-supplied parser which does the real work.
XmlErrorHandlerm_errorHandler
EResolverm_resolver
 Entity resolver.
bool m_throwErrors
bool m_errorsOccurred
bool m_doSchema

Static Private Attributes

static int didInit = 0


Detailed Description

Definition at line 22 of file XmlParser.h.


Constructor & Destructor Documentation

xmlBase::XmlParser::XmlParser ( bool  throwErrors = false  ) 

Definition at line 39 of file XmlParser.cxx.

References didInit, m_errorHandler, m_parser, m_resolver, m_throwErrors, release, and deljobs::string.

00039                                        : m_throwErrors(throwErrors),
00040                                            m_doSchema(false) {
00041     if (!didInit) {
00042       try {
00043         XMLPlatformUtils::Initialize();
00044       }
00045       catch(const XMLException& toCatch)
00046       {  // may want to redirect in Gaudi environment
00047         char*  charMsg = XMLString::transcode(toCatch.getMessage());
00048         std::string msg = std::string(charMsg);
00049         XMLString::release(&charMsg);
00050         
00051         std::string errMsg("Error during Xerces-c Initialization: \n");
00052         errMsg += " Exception message: ";
00053         errMsg += msg;
00054         if (m_throwErrors) {
00055           throw ParseException(msg);
00056         }  else {
00057           std::cerr << errMsg << std::endl;
00058           return;
00059         }
00060       }
00061       didInit = 1;
00062     }
00063     m_parser = new XercesDOMParser();
00064 
00065     m_errorHandler = new XmlErrorHandler(throwErrors);
00066 
00067     // According to documentation we shouldn't need this, but
00068     // just in case..
00069     m_parser->setValidationScheme(AbstractDOMParser::Val_Auto);
00070     /*
00071     m_parser->setDoNamespaces(true);
00072     m_parser->setDoSchema(true);
00073     m_parser->setValidationSchemaFullChecking(true);
00074     */
00075 
00076     m_resolver = new EResolver();
00077     m_parser->setXMLEntityResolver(m_resolver);
00078     m_parser->setErrorHandler(m_errorHandler);
00079 
00080     
00081 
00082     // Don't keep entity reference nodes.  We don't use them
00083     // and they can cause confusion
00084     m_parser->setCreateEntityReferenceNodes(false);
00085     // Have to leave this line out for now since it causes weirdness
00086     // with DOMDocument::getElementById
00087 
00088     // As long as we don't need to re-serialize, we can forget about
00089     // ingnorable white space and save a bit of memory.
00090     m_parser->setIncludeIgnorableWhitespace(false);
00091   }

xmlBase::XmlParser::~XmlParser (  ) 

Definition at line 101 of file XmlParser.cxx.

References m_errorHandler, and m_resolver.

00101                         {
00102     delete m_errorHandler;
00103     delete m_resolver;
00104     // delete m_parser;  temporary, until we can figure out why there 
00105     // are sometimes problems while freeing this piece of memory.
00106   }


Member Function Documentation

void xmlBase::XmlParser::doSchema ( bool  doit  ) 

Call this method to turn on schema processing (else it's off).

Definition at line 92 of file XmlParser.cxx.

References m_doSchema, and m_parser.

Referenced by xmlBase::IFile::IFile(), and rdbModel::XercesBuilder::parseInput().

00092                                     {
00093     m_doSchema = doit;  // just to keep a record of what we think we're doing
00094 
00095     //    m_parser->setValidationScheme(AbstractDOMParser::Val_Always);
00096     m_parser->setDoNamespaces(doit);
00097     m_parser->setDoSchema(doit);
00098     m_parser->setValidationSchemaFullChecking(doit);
00099   }

DOMDocument * xmlBase::XmlParser::parse ( const std::string buffer,
const std::string docType = std::string("") 
)

Parse an xml file as a string, returning document node if successful.

Definition at line 180 of file XmlParser.cxx.

References checkDocType(), xmlBase::XmlErrorHandler::getErrorCount(), xmlBase::XmlErrorHandler::getFatalCount(), m_errorHandler, m_errorsOccurred, m_parser, m_throwErrors, release, and deljobs::string.

00181                                                           {
00182   XERCES_CPP_NAMESPACE_USE
00183      
00184   // parse file
00185     m_errorsOccurred = false;
00186     try {
00187       char fakeid =99;
00188       XMLCh* buffer = XMLString::transcode(input.c_str());
00189       //      XMLCh* buffer = Dom::transToXMLCh(input.c_str());
00190 
00191       unsigned int byteCount = sizeof(XMLCh) * input.length();  
00192 
00193       MemBufInputSource source((const unsigned char*)buffer, byteCount, 
00194                                &fakeid, false);
00195       m_parser->parse(source);
00196       XMLString::release(&buffer);
00197     }
00198     catch   (const XMLException& e) {
00199       char* charMsg = XMLString::transcode(e.getMessage());
00200       std::string msg = std::string(charMsg);
00201       XMLString::release(&charMsg);
00202       m_errorsOccurred = true;
00203       m_parser->reset();
00204 
00205       std::string errMsg("xmlBase::XmlParser::parse ");
00206       errMsg += 
00207         "An error occurred while parsing MemBufInputSource\n  Message: ";
00208       if (m_throwErrors) {
00209         throw ParseException(errMsg);
00210       } else {
00211         std::cerr << errMsg << std::endl;
00212         return 0;
00213       }
00214       //      std::string msg(Dom::transToChar(e.getMessage()));
00215       std::cerr << 
00216         "An error occurred while parsing MemBufInputSource\n  Message: " <<
00217         msg << std::endl;
00218       return 0;
00219     }
00220 
00221     if (m_errorHandler->getFatalCount() + m_errorHandler->getErrorCount()) {
00222       // Put out message
00223       m_parser->reset();  // may be used to parse new input
00224       return 0;
00225     }
00226 
00227     if (docType != std::string("")) { // check actual docType matches requested
00228       bool ok = checkDocType(m_parser->getDocument(), docType);
00229 
00230       if (ok) return m_parser->getDocument();
00231 
00232       // Either there was no docType at all or it didn't match
00233       m_parser->reset();
00234       return 0;
00235     }
00236 
00237     return m_parser->getDocument();
00238     // if ok return document node; else null
00239 
00240 
00241   }

DOMDocument * xmlBase::XmlParser::parse ( const char *const   filename,
const std::string docType = std::string("") 
)

Parse an xml file, returning document node if successful.

Definition at line 108 of file XmlParser.cxx.

References checkDocType(), xmlBase::EResolver::clean(), fname, xmlBase::XmlErrorHandler::getErrorCount(), xmlBase::XmlErrorHandler::getFatalCount(), m_errorHandler, m_errorsOccurred, m_parser, m_resolver, m_throwErrors, release, and deljobs::string.

Referenced by xmlBase::IFile::IFile(), main(), rdbModel::MysqlConnection::open(), xmlBase::DocMan::parse(), CalibXmlCnvSvc::parse(), rdbModel::XercesBuilder::parseInput(), and calibUtil::StripSrv::StripSrv().

00109                                                           {
00110     XERCES_CPP_NAMESPACE_USE
00111     // Reset from any previous parse
00112     m_errorsOccurred = false;
00113     m_resolver->clean();
00114 
00115     // translate environment variables, if any
00116     std::string fname(filename);
00117     int nExpand = facilities::Util::expandEnvVar(&fname);
00118     if (nExpand < 0) {
00119       std::string errMsg("xmlBase::XmlParser::parse ");
00120       errMsg += "Filename arg. contained untranslatable env. variables";
00121       if (m_throwErrors) {
00122         throw 
00123           ParseException(errMsg);
00124       } else {
00125         std::cerr << errMsg << std::endl;
00126         return 0;
00127       }
00128     }
00129     
00130     // parse file
00131     try {
00132       //      XMLCh* filenameXMLCh = Dom::transToXMLCh(filename);
00133       XMLCh* filenameXMLCh = XMLString::transcode(fname.c_str());
00134       LocalFileInputSource fileSource(filenameXMLCh);
00135       m_parser->parse(fileSource);
00136       XMLString::release(&filenameXMLCh);
00137     }
00138     catch   (const XMLException& e) {
00139       char* charMsg = XMLString::transcode(e.getMessage());
00140       std::string msg = std::string(charMsg);
00141       XMLString::release(&charMsg);
00142       std::string errMsg("xmlBase::XmlParser::parse ");
00143       errMsg += "Error occurred while parsing file ";
00144       errMsg += fname;
00145       m_errorsOccurred = true;
00146       m_parser->reset();
00147       if (m_throwErrors) {
00148         errMsg += "  ";
00149         errMsg += msg;
00150         throw ParseException(errMsg);
00151       }
00152       else {
00153         std::cerr << errMsg << std::endl
00154                   << "Message: " << msg << std::endl;
00155         return 0;
00156       }
00157 
00158     }
00159 
00160     if (m_errorHandler->getFatalCount() + m_errorHandler->getErrorCount()) {
00161       // Put out message
00162       m_parser->reset();  // may be used to parse new input
00163       return 0;
00164     }
00165     if (docType != std::string("")) { // check actual docType matches requested
00166       bool ok = checkDocType(m_parser->getDocument(), docType);
00167 
00168       if (ok) return m_parser->getDocument();
00169 
00170       // Either there was no docType at all or it didn't match
00171       m_parser->reset();
00172       return 0;
00173     }
00174 
00175     return m_parser->getDocument();
00176     // if ok return document node; else null
00177   }

void xmlBase::XmlParser::reset (  )  [inline]

Reset the parser so it may be used to parse another document (note this destroys old DOM)

Definition at line 41 of file XmlParser.h.

References m_parser.

Referenced by xmlBase::DocMan::parse().

00041 {m_parser->reset();}


Member Data Documentation

XERCES_CPP_NAMESPACE_USE int xmlBase::XmlParser::didInit = 0 [static, private]

Definition at line 51 of file XmlParser.h.

Referenced by XmlParser().

bool xmlBase::XmlParser::m_doSchema [private]

Definition at line 50 of file XmlParser.h.

Referenced by doSchema().

XmlErrorHandler* xmlBase::XmlParser::m_errorHandler [private]

Definition at line 45 of file XmlParser.h.

Referenced by parse(), XmlParser(), and ~XmlParser().

bool xmlBase::XmlParser::m_errorsOccurred [private]

Definition at line 49 of file XmlParser.h.

Referenced by parse().

XercesDOMParser* xmlBase::XmlParser::m_parser [private]

Xerces-supplied parser which does the real work.

Definition at line 44 of file XmlParser.h.

Referenced by doSchema(), parse(), reset(), and XmlParser().

EResolver* xmlBase::XmlParser::m_resolver [private]

Entity resolver.

Definition at line 47 of file XmlParser.h.

Referenced by parse(), XmlParser(), and ~XmlParser().

bool xmlBase::XmlParser::m_throwErrors [private]

Definition at line 48 of file XmlParser.h.

Referenced by parse(), and XmlParser().


Generated on Tue Nov 29 23:36:39 2016 for BOSS_7.0.2 by  doxygen 1.4.7