43 #include <libxml/parser.h>
44 #include <libxml/parserInternals.h>
47 class TSAXParserCallback {
49 static void StartDocument(
void *fParser);
50 static void EndDocument(
void *fParser);
51 static void StartElement(
void *fParser,
const xmlChar *name,
const xmlChar **p);
52 static void EndElement(
void *fParser,
const xmlChar *name);
53 static void Characters(
void *fParser,
const xmlChar *ch, Int_t len);
54 static void Comment(
void *fParser,
const xmlChar *value);
55 static void CdataBlock(
void *fParser,
const xmlChar *value, Int_t len);
56 static void Warning(
void *fParser,
const char *fmt, ...);
57 static void Error(
void *fParser,
const char *fmt, ...);
58 static void FatalError(
void *fParser,
const char *fmt, ...);
67 TSAXParser::TSAXParser()
69 fSAXHandler =
new xmlSAXHandler;
70 memset(fSAXHandler, 0,
sizeof(xmlSAXHandler));
72 fSAXHandler->startDocument =
73 (startDocumentSAXFunc)TSAXParserCallback::StartDocument;
74 fSAXHandler->endDocument =
75 (endDocumentSAXFunc)TSAXParserCallback::EndDocument;
76 fSAXHandler->startElement =
77 (startElementSAXFunc)TSAXParserCallback::StartElement;
78 fSAXHandler->endElement =
79 (endElementSAXFunc)TSAXParserCallback::EndElement;
80 fSAXHandler->characters =
81 (charactersSAXFunc)TSAXParserCallback::Characters;
82 fSAXHandler->comment =
83 (commentSAXFunc)TSAXParserCallback::Comment;
84 fSAXHandler->cdataBlock =
85 (cdataBlockSAXFunc)TSAXParserCallback::CdataBlock;
86 fSAXHandler->warning =
87 (warningSAXFunc)TSAXParserCallback::Warning;
89 (errorSAXFunc)TSAXParserCallback::Error;
90 fSAXHandler->fatalError =
91 (fatalErrorSAXFunc)TSAXParserCallback::FatalError;
97 TSAXParser::~TSAXParser()
107 void TSAXParser::OnStartDocument()
109 Emit(
"OnStartDocument()");
115 void TSAXParser::OnEndDocument()
117 Emit(
"OnEndDocument()");
126 void TSAXParser::OnStartElement(
const char *name,
const TList *attributes)
129 args[0] = (Long_t)name;
130 args[1] = (Long_t)attributes;
132 Emit(
"OnStartElement(const char *, const TList *)", args);
138 void TSAXParser::OnEndElement(
const char *name)
140 Emit(
"OnEndElement(const char *)", name);
147 void TSAXParser::OnCharacters(
const char *characters)
149 Emit(
"OnCharacters(const char *)", characters);
155 void TSAXParser::OnComment(
const char *text)
157 Emit(
"OnComment(const char *)", text);
163 void TSAXParser::OnWarning(
const char *text)
165 Emit(
"OnWarning(const char *)", text);
172 Int_t TSAXParser::OnError(
const char *text)
174 Emit(
"OnError(const char *)", text);
182 Int_t TSAXParser::OnFatalError(
const char *text)
184 Emit(
"OnFatalError(const char *)", text);
191 void TSAXParser::OnCdataBlock(
const char *text, Int_t len)
194 args[0] = (Long_t)text;
197 Emit(
"OnCdataBlock(const char *, Int_t)", args);
206 Int_t TSAXParser::Parse()
212 xmlSAXHandlerPtr oldSAX = fContext->sax;
213 fContext->sax = fSAXHandler;
214 fContext->userData =
this;
218 xmlParseDocument(fContext);
220 fContext->sax = oldSAX;
222 if (!fContext->wellFormed && fParseCode == 0) {
236 Int_t TSAXParser::ParseFile(
const char *filename)
243 fContext = xmlCreateFileParserCtxt(filename);
253 Int_t TSAXParser::ParseBuffer(
const char *contents, Int_t len)
260 fContext = xmlCreateMemoryParserCtxt(contents, len);
270 void TSAXParserCallback::StartDocument(
void *fParser)
272 TSAXParser *parser = (TSAXParser*)fParser;
273 parser->OnStartDocument();
279 void TSAXParserCallback::EndDocument(
void *fParser)
281 TSAXParser *parser = (TSAXParser*)fParser;
282 parser->OnEndDocument();
289 void TSAXParserCallback::StartElement(
void *fParser,
const xmlChar *name,
292 TSAXParser *parser = (TSAXParser*)fParser;
293 TList *attributes =
new TList;
296 for (
const xmlChar **cur = p; cur && *cur; cur += 2) {
297 attributes->Add(
new TXMLAttr((
const char*)*cur,
298 (
const char*)*(cur + 1)));
302 parser->OnStartElement((
const char*) name, attributes);
304 attributes->Delete();
311 void TSAXParserCallback::EndElement(
void *fParser,
const xmlChar *name)
313 TSAXParser *parser = (TSAXParser*)fParser;
314 parser->OnEndElement((
const char*) name);
322 void TSAXParserCallback::Characters(
void *fParser,
const xmlChar *ch,
325 TSAXParser *parser = (TSAXParser*)fParser;
327 char *str =
new char[len+1];
328 strlcpy(str, (
const char*) ch, len+1);
331 parser->OnCharacters(str);
340 void TSAXParserCallback::Comment(
void *fParser,
const xmlChar *value)
342 TSAXParser *parser = (TSAXParser*)fParser;
343 parser->OnComment((
const char*) value);
350 void TSAXParserCallback::Warning(
void * fParser,
const char *va_(fmt), ...)
352 TSAXParser *parser = (TSAXParser*)fParser;
357 va_start(arg, va_(fmt));
358 vsnprintf(buffer, 2048, va_(fmt), arg);
361 TString buff(buffer);
363 parser->OnWarning(buff.Data());
370 void TSAXParserCallback::Error(
void *fParser,
const char *va_(fmt), ...)
373 TSAXParser *parser = (TSAXParser*)fParser;
378 va_start(arg, va_(fmt));
379 vsnprintf(buffer, 2048, va_(fmt), arg);
382 TString buff(buffer);
384 errorcode = parser->OnError(buff.Data());
386 parser->SetParseCode(errorcode);
389 if (errorcode < 0 && parser->GetStopOnError()) {
391 parser->StopParser();
399 void TSAXParserCallback::FatalError(
void *fParser,
const char *va_(fmt), ...)
402 TSAXParser *parser = (TSAXParser*)fParser;
407 va_start(arg, va_(fmt));
408 vsnprintf(buffer, 2048, va_(fmt), arg);
411 TString buff(buffer);
413 errorcode = parser->OnFatalError(buff);
415 parser->SetParseCode(errorcode);
416 parser->StopParser();
423 void TSAXParserCallback::CdataBlock(
void *fParser,
const xmlChar *value,
426 TSAXParser *parser = (TSAXParser*)fParser;
427 parser->OnCdataBlock((
const char*)value, len);
441 void TSAXParser::ConnectToHandler(
const char *handlerName,
void *handler)
443 const TString kFunctionsName [] = {
446 "OnStartElement(const char *, const TList *)",
447 "OnEndElement(const char *)",
448 "OnCharacters(const char *)",
449 "OnComment(const char *)",
450 "OnWarning(const char *)",
451 "OnError(const char *)",
452 "OnFatalError(const char *)",
453 "OnCdataBlock(const char *, Int_t)"
456 TClass *cl = TClass::GetClass(handlerName);
458 for (Int_t i = 0; i < 10; i++) {
459 if (CheckConnectArgs(
this, this->IsA(), kFunctionsName[i],
460 cl, kFunctionsName[i]) != -1)
461 Connect(kFunctionsName[i], handlerName, handler, kFunctionsName[i]);