Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

XmlParser.cxx

Go to the documentation of this file.
00001 // $Header: /nfs/slac/g/glast/ground/cvs/xml/src/XmlParser.cxx,v 1.9 2001/09/17 23:52:08 jrb Exp $
00002 // Author: J. Bogart
00003 
00004 #include <iostream>   // for endl, cerr,...
00005 #include "xml/XmlParser.h"
00006 #include "xml/Dom.h"
00007 #include <framework/LocalFileInputSource.hpp>
00008 #include <framework/MemBufInputSource.hpp>
00009 #include <util/XMLString.hpp>
00010 #include <util/PlatformUtils.hpp>
00011 
00012 namespace xml {
00013   int XmlParser::didInit = 0;
00014 
00015   XmlParser::XmlParser() {
00016     if (!didInit) {
00017       try {
00018         XMLPlatformUtils::Initialize();
00019       }
00020       catch(const XMLException& toCatch)
00021       {  // may want to redirect in Gaudi environment
00022         std::string msg(Dom::transToChar(toCatch.getMessage()));
00023         std::cerr << "Error during Xerces-c Initialization.\n"
00024              << "  Exception message:"
00025              << msg << std::endl;
00026         return;
00027       }
00028       didInit = 1;
00029     }
00030     m_parser = new DOMParser();
00031 
00032     m_errorHandler = new XmlErrorHandler();
00033     m_parser->setErrorHandler(m_errorHandler);
00034 
00035     // According to documentation we shouldn't need this, but
00036     // just in case..
00037     m_parser->setValidationScheme(DOMParser::Val_Auto);
00038 
00039     // As long as we don't need to re-serialize, we can forget about
00040     // ingnorable white space and save a bit of memory.
00041     m_parser->setIncludeIgnorableWhitespace(false);
00042   }
00043 
00044   XmlParser::~XmlParser() {
00045     delete m_errorHandler;
00046     // delete m_parser;  temporary, until we can figure out why there are sometimes problems
00047     // while freeing this piece of memory.
00048   }
00049     
00050   DOM_Document XmlParser::parse(const char* const filename) {
00051 
00052     // parse file
00053     m_errorsOccurred = false;
00054     try {
00055       XMLCh* filenameXMLCh = Dom::transToXMLCh(filename);
00056       LocalFileInputSource fileSource(filenameXMLCh);
00057       m_parser->parse(fileSource);
00058     }
00059     catch   (const XMLException& e) {
00060       std::string msg(Dom::transToChar(e.getMessage()));
00061       std::cerr << "An error occured during parsing\n   Message: "
00062            << msg << std::endl;
00063       m_errorsOccurred = true;
00064       m_parser->reset();
00065       return DOM_Document();
00066     }
00067 
00068     if (m_errorHandler->getFatalCount() + m_errorHandler->getErrorCount()) {
00069       // Put out message
00070       m_parser->reset();  // may be used to parse new input
00071       return DOM_Document();
00072     }
00073     return m_parser->getDocument();
00074     // if ok return document node; else null
00075   }
00076 
00077 
00078   // this is the string version, very stupidly mostly copied from above. 
00079   DOM_Document XmlParser::parse(const std::string& input) {
00080 
00081      
00082          // parse file
00083     m_errorsOccurred = false;
00084     try {
00085       char fakeid =99;
00086       XMLCh* buffer = Dom::transToXMLCh(input.c_str());
00087 
00088       unsigned int byteCount = sizeof(XMLCh) * input.length();  
00089 
00090       MemBufInputSource source((const unsigned char*)buffer, byteCount, &fakeid, false);
00091       m_parser->parse(source);
00092     }
00093     catch   (const XMLException& e) {
00094       std::string msg(Dom::transToChar(e.getMessage()));
00095       std::cerr << "An error occured during parsing\n   Message: "
00096            << msg << std::endl;
00097       m_errorsOccurred = true;
00098       m_parser->reset();
00099       return DOM_Document();
00100     }
00101 
00102     if (m_errorHandler->getFatalCount() + m_errorHandler->getErrorCount()) {
00103       // Put out message
00104       m_parser->reset();  // may be used to parse new input
00105       return DOM_Document();
00106     }
00107     return m_parser->getDocument();
00108     // if ok return document node; else null
00109 
00110 
00111   }
00112 
00113 }     // end namespace

Generated at Wed Nov 21 12:22:26 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000