00001 ////////////////////////////////////////////////////////////////////////////// 00002 // 00003 // ROOT implementation of a simple SAX Handler. 00004 // 00005 // This handler uses TSAXParser, a SAX Parser using the SAX interface 00006 // of libxml2. This script will output all elements of the original xml 00007 // file, if sucessfully parsed. 00008 // 00009 // To run this program do: 00010 // .x SAXHandler.C 00011 // 00012 // Requires: saxexample.xml 00013 // 00014 ////////////////////////////////////////////////////////////////////////////// 00015 00016 #include <Riostream.h> 00017 #include <TList.h> 00018 #include <TSAXParser.h> 00019 #include <TXMLAttr.h> 00020 00021 00022 class SaxHandler { 00023 public: 00024 SaxHandler() { } 00025 00026 void OnStartDocument() { } 00027 void OnEndDocument(); 00028 void OnStartElement(const char*, const TList*); 00029 void OnEndElement(const char*); 00030 void OnCharacters(const char*); 00031 void OnComment(const char*); 00032 void OnWarning(const char*); 00033 void OnError(const char*); 00034 void OnFatalError(const char*); 00035 void OnCdataBlock(const char*, Int_t); 00036 }; 00037 00038 void SaxHandler::OnEndDocument() 00039 { 00040 cout << endl; 00041 } 00042 00043 void SaxHandler::OnStartElement(const char *name, const TList *attributes) 00044 { 00045 cout << "<" << name; 00046 00047 TXMLAttr *attr; 00048 00049 TIter next(attributes); 00050 while ((attr = (TXMLAttr*) next())) { 00051 cout << " " << attr->GetName() << "=\"" << attr->GetValue() << "\""; 00052 } 00053 00054 cout << ">"; 00055 } 00056 00057 void SaxHandler::OnEndElement(const char *name) 00058 { 00059 cout << "</" << name << ">"; 00060 } 00061 00062 void SaxHandler::OnCharacters(const char *characters) 00063 { 00064 cout << characters; 00065 } 00066 00067 void SaxHandler::OnComment(const char *text) 00068 { 00069 cout << "<!--" << text << "-->"; 00070 } 00071 00072 void SaxHandler::OnWarning(const char *text) 00073 { 00074 cout << "Warning: " << text << endl; 00075 } 00076 00077 void SaxHandler::OnError(const char *text) 00078 { 00079 cerr << "Error: " << text << endl ; 00080 } 00081 00082 void SaxHandler::OnFatalError(const char *text) 00083 { 00084 cerr << "FatalError: " << text << endl ; 00085 } 00086 00087 void SaxHandler::OnCdataBlock(const char *text, Int_t len) 00088 { 00089 cout << "OnCdataBlock() " << text; 00090 } 00091 00092 00093 00094 void SAXHandler() 00095 { 00096 TSAXParser *saxParser = new TSAXParser(); 00097 SaxHandler *saxHandler = new SaxHandler(); 00098 00099 saxParser->ConnectToHandler("SaxHandler", saxHandler); 00100 saxParser->ParseFile("saxexample.xml"); 00101 }