00001
00002
00003
00004 #include <iostream>
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 {
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
00036
00037 m_parser->setValidationScheme(DOMParser::Val_Auto);
00038
00039
00040
00041 m_parser->setIncludeIgnorableWhitespace(false);
00042 }
00043
00044 XmlParser::~XmlParser() {
00045 delete m_errorHandler;
00046
00047
00048 }
00049
00050 DOM_Document XmlParser::parse(const char* const filename) {
00051
00052
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
00070 m_parser->reset();
00071 return DOM_Document();
00072 }
00073 return m_parser->getDocument();
00074
00075 }
00076
00077
00078
00079 DOM_Document XmlParser::parse(const std::string& input) {
00080
00081
00082
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
00104 m_parser->reset();
00105 return DOM_Document();
00106 }
00107 return m_parser->getDocument();
00108
00109
00110
00111 }
00112
00113 }