ROOT logo
/* 
Author : Harsh Arora (harsh.arora@cern.ch)

   
AliXMLParser
---------

AliXMLParser is a tool to parse XML file from URL or path and store it in trees.

*/

#include "AliXMLParser.h"

#include <Riostream.h>
#include "TTree.h"
#include "TBranch.h"
#include "TWebFile.h"
#include <iostream>
#include <cstdlib>
#include <TList.h>
#include <TString.h>

using std::cerr;
using std::cout;
using std::endl;

ClassImp(AliXMLParser);

AliXMLParser::AliXMLParser():
   fTreeList(0),
   fTableTag(0),
   fInsideTree(kFALSE),
   fNumTokens(0),
   fEntries(0),
   fVal(0),
   fNumTrees(0),
   fError(kFALSE)
{
   //Default Contructor

   fEntries = new TList();
   fVal = new TList();
   fTreeList = new TList();
   fInsideTree = kFALSE;
   fNumTrees = 0;
   fNumTokens = -1;
   fError = kFALSE;

   fEntries->SetOwner(kTRUE);
   fVal->SetOwner(kTRUE);
   fTreeList->SetOwner(kTRUE);
}

AliXMLParser::AliXMLParser(const AliXMLParser& obj):
   fTreeList(0),
   fTableTag(0),
   fInsideTree(kFALSE),
   fNumTokens(0),
   fEntries(0),
   fVal(0),
   fNumTrees(0),
   fError(kFALSE)
{
   //Copy Contructor
   fTreeList = obj.fTreeList;
   fTableTag = obj.fTableTag;
   fInsideTree = obj.fInsideTree;
   fNumTokens = obj.fNumTokens;
   fEntries = obj.fEntries;
   fVal = obj.fVal;
   fNumTrees = obj.fNumTrees;
   fError = obj.fError;
}

AliXMLParser& AliXMLParser::operator=(const AliXMLParser& other)
{
   //Assignment
   if(this != &other)
   {
      fTreeList = other.fTreeList;
      fTableTag = other.fTableTag;
      fInsideTree = other.fInsideTree;
      fNumTokens = other.fNumTokens;
      fEntries = other.fEntries;
      fVal = other.fVal;
      fNumTrees = other.fNumTrees;
      fError = other.fError;
   }
   return *this;
}

void AliXMLParser::OnStartDocument() {}

int AliXMLParser::GetEntryIndex(TString entry_name) //Finds the attribute index by name
{
   int i;
   for(i=0;i<=fNumTokens;i++)
   {
      if(entry_name.EqualTo(*(TString *)(fEntries->At(i))))
         return i;
   }
   return -1;
}

void AliXMLParser::OnStartElement(const char *name, const TList *attributes) //Stores Parsed XML in a Tree
{
   int n,i;
   TString tree_symbol = "roottreename";
   TString var(name);
   TString temp("");
   TXMLAttr *attr;
   TIter next(attributes);
   TBranch *branch;
   TTree *curr_tree;

   if((attr = (TXMLAttr*) next()))
   {
      if((!fInsideTree) && tree_symbol.EqualTo(attr->GetName())) //If tag found, Enter a new tree
      {
         fTableTag = name;
         fNumTrees++;
         fTreeList->Add((TObject *)(new TTree(attr->GetValue(),attr->GetValue())));
         fInsideTree = kTRUE;
      }
      else if(fInsideTree)
      {
         curr_tree=(TTree *)(fTreeList->At(fNumTrees-1));
         do
         {
            if(!(curr_tree->GetBranch(attr->GetName())))
          
            {
               TString var_type = attr->GetName();
               var_type += "/C";
               fNumTokens++;

               fEntries->Add((TObject *)(new TString(attr->GetName())));

               fVal->Add((TObject *)(new TString(temp)));

               //Adding Attributes as branches of TTree
               branch = curr_tree->Branch(attr->GetName(), (void *)(((TString *)(fVal->At(fNumTokens)))->Data()), var_type);
               n = curr_tree->GetEntries();
               if(n > 0)
               {
                  (*(TString *)(fVal->At(fNumTokens))) = temp;
                  for(i=0;i<n;i++)
                     branch->Fill();
               }

            }

            (*(TString *)(fVal->At(GetEntryIndex(attr->GetName())))) = attr->GetValue();

           
         } while ((attr = (TXMLAttr*) next()));
         curr_tree->Fill(); //Fill the tree with attribute values
         for(i=0;i<=fNumTokens;i++)
         {
            (*(TString *)(fVal->At(i))) = temp;
         }
      }
   }
}

      
   
void AliXMLParser::OnEndElement(const char *name)
{
   //if tag closes, re-initialize everything for a new tree
   if(fTableTag.EqualTo(name))
   {
      fInsideTree = kFALSE;
      fEntries->Clear("nodelete");
      fVal->Clear("nodelete");
      fNumTokens=-1;
   }
}

void AliXMLParser::OnCharacters(const char *) {} 

void AliXMLParser::OnComment(const char *) {}

void AliXMLParser::OnWarning(const char *warning) 
{
   cout << "Warning in XML: " << warning << endl;
}

void AliXMLParser::OnError(const char *error) 
{ 
   fError = kTRUE;
   cerr << "Error in XML: " << error << endl;
}

void AliXMLParser::OnFatalError(const char *error)
{ 
   fError = kTRUE;
   cerr << "FatalError in XML: " << error << endl;
}

void AliXMLParser::OnCdataBlock(const char *, Int_t ) {}

void AliXMLParser::OnEndDocument() {}

AliXMLParser::~AliXMLParser()
{
   delete fEntries;
   delete fVal;
   delete fTreeList;
}


TList* AliXMLParser::GetTreesFromXML(TString file) //Returns List of Trees by parsing local XML file
{
   TSAXParser *saxParser = new TSAXParser();
   saxParser->ConnectToHandler("AliXMLParser", this);
   if(!TFile::Open(file)) 
   {
      cerr << "File not found" << endl;
      return 0x0;
   }
   saxParser->ParseFile(file);
   delete saxParser;
   if (fError) return 0x0;
   return fTreeList;
}

TList *AliXMLParser::GetTreesFromURL(TString host) //Returns List of Trees by parsing remote XML file
{
   char *buf;
   int size;
   TSAXParser *saxParser = new TSAXParser();
   saxParser->ConnectToHandler("AliXMLParser", this);
   host += "&filetype=raw";
   TFile *file = TFile::Open(host);
   if (!file)
   {
      cerr << "Invalid URL" << endl;
      return 0x0;
   }
   size=file->GetSize();
   buf = (char *)malloc(size+1);
   file->ReadBuffer(buf, size);
   saxParser->ParseBuffer(buf,size);
   delete saxParser;
   free(buf);
   if (fError) return 0x0;
   return fTreeList;
}
 AliXMLParser.cxx:1
 AliXMLParser.cxx:2
 AliXMLParser.cxx:3
 AliXMLParser.cxx:4
 AliXMLParser.cxx:5
 AliXMLParser.cxx:6
 AliXMLParser.cxx:7
 AliXMLParser.cxx:8
 AliXMLParser.cxx:9
 AliXMLParser.cxx:10
 AliXMLParser.cxx:11
 AliXMLParser.cxx:12
 AliXMLParser.cxx:13
 AliXMLParser.cxx:14
 AliXMLParser.cxx:15
 AliXMLParser.cxx:16
 AliXMLParser.cxx:17
 AliXMLParser.cxx:18
 AliXMLParser.cxx:19
 AliXMLParser.cxx:20
 AliXMLParser.cxx:21
 AliXMLParser.cxx:22
 AliXMLParser.cxx:23
 AliXMLParser.cxx:24
 AliXMLParser.cxx:25
 AliXMLParser.cxx:26
 AliXMLParser.cxx:27
 AliXMLParser.cxx:28
 AliXMLParser.cxx:29
 AliXMLParser.cxx:30
 AliXMLParser.cxx:31
 AliXMLParser.cxx:32
 AliXMLParser.cxx:33
 AliXMLParser.cxx:34
 AliXMLParser.cxx:35
 AliXMLParser.cxx:36
 AliXMLParser.cxx:37
 AliXMLParser.cxx:38
 AliXMLParser.cxx:39
 AliXMLParser.cxx:40
 AliXMLParser.cxx:41
 AliXMLParser.cxx:42
 AliXMLParser.cxx:43
 AliXMLParser.cxx:44
 AliXMLParser.cxx:45
 AliXMLParser.cxx:46
 AliXMLParser.cxx:47
 AliXMLParser.cxx:48
 AliXMLParser.cxx:49
 AliXMLParser.cxx:50
 AliXMLParser.cxx:51
 AliXMLParser.cxx:52
 AliXMLParser.cxx:53
 AliXMLParser.cxx:54
 AliXMLParser.cxx:55
 AliXMLParser.cxx:56
 AliXMLParser.cxx:57
 AliXMLParser.cxx:58
 AliXMLParser.cxx:59
 AliXMLParser.cxx:60
 AliXMLParser.cxx:61
 AliXMLParser.cxx:62
 AliXMLParser.cxx:63
 AliXMLParser.cxx:64
 AliXMLParser.cxx:65
 AliXMLParser.cxx:66
 AliXMLParser.cxx:67
 AliXMLParser.cxx:68
 AliXMLParser.cxx:69
 AliXMLParser.cxx:70
 AliXMLParser.cxx:71
 AliXMLParser.cxx:72
 AliXMLParser.cxx:73
 AliXMLParser.cxx:74
 AliXMLParser.cxx:75
 AliXMLParser.cxx:76
 AliXMLParser.cxx:77
 AliXMLParser.cxx:78
 AliXMLParser.cxx:79
 AliXMLParser.cxx:80
 AliXMLParser.cxx:81
 AliXMLParser.cxx:82
 AliXMLParser.cxx:83
 AliXMLParser.cxx:84
 AliXMLParser.cxx:85
 AliXMLParser.cxx:86
 AliXMLParser.cxx:87
 AliXMLParser.cxx:88
 AliXMLParser.cxx:89
 AliXMLParser.cxx:90
 AliXMLParser.cxx:91
 AliXMLParser.cxx:92
 AliXMLParser.cxx:93
 AliXMLParser.cxx:94
 AliXMLParser.cxx:95
 AliXMLParser.cxx:96
 AliXMLParser.cxx:97
 AliXMLParser.cxx:98
 AliXMLParser.cxx:99
 AliXMLParser.cxx:100
 AliXMLParser.cxx:101
 AliXMLParser.cxx:102
 AliXMLParser.cxx:103
 AliXMLParser.cxx:104
 AliXMLParser.cxx:105
 AliXMLParser.cxx:106
 AliXMLParser.cxx:107
 AliXMLParser.cxx:108
 AliXMLParser.cxx:109
 AliXMLParser.cxx:110
 AliXMLParser.cxx:111
 AliXMLParser.cxx:112
 AliXMLParser.cxx:113
 AliXMLParser.cxx:114
 AliXMLParser.cxx:115
 AliXMLParser.cxx:116
 AliXMLParser.cxx:117
 AliXMLParser.cxx:118
 AliXMLParser.cxx:119
 AliXMLParser.cxx:120
 AliXMLParser.cxx:121
 AliXMLParser.cxx:122
 AliXMLParser.cxx:123
 AliXMLParser.cxx:124
 AliXMLParser.cxx:125
 AliXMLParser.cxx:126
 AliXMLParser.cxx:127
 AliXMLParser.cxx:128
 AliXMLParser.cxx:129
 AliXMLParser.cxx:130
 AliXMLParser.cxx:131
 AliXMLParser.cxx:132
 AliXMLParser.cxx:133
 AliXMLParser.cxx:134
 AliXMLParser.cxx:135
 AliXMLParser.cxx:136
 AliXMLParser.cxx:137
 AliXMLParser.cxx:138
 AliXMLParser.cxx:139
 AliXMLParser.cxx:140
 AliXMLParser.cxx:141
 AliXMLParser.cxx:142
 AliXMLParser.cxx:143
 AliXMLParser.cxx:144
 AliXMLParser.cxx:145
 AliXMLParser.cxx:146
 AliXMLParser.cxx:147
 AliXMLParser.cxx:148
 AliXMLParser.cxx:149
 AliXMLParser.cxx:150
 AliXMLParser.cxx:151
 AliXMLParser.cxx:152
 AliXMLParser.cxx:153
 AliXMLParser.cxx:154
 AliXMLParser.cxx:155
 AliXMLParser.cxx:156
 AliXMLParser.cxx:157
 AliXMLParser.cxx:158
 AliXMLParser.cxx:159
 AliXMLParser.cxx:160
 AliXMLParser.cxx:161
 AliXMLParser.cxx:162
 AliXMLParser.cxx:163
 AliXMLParser.cxx:164
 AliXMLParser.cxx:165
 AliXMLParser.cxx:166
 AliXMLParser.cxx:167
 AliXMLParser.cxx:168
 AliXMLParser.cxx:169
 AliXMLParser.cxx:170
 AliXMLParser.cxx:171
 AliXMLParser.cxx:172
 AliXMLParser.cxx:173
 AliXMLParser.cxx:174
 AliXMLParser.cxx:175
 AliXMLParser.cxx:176
 AliXMLParser.cxx:177
 AliXMLParser.cxx:178
 AliXMLParser.cxx:179
 AliXMLParser.cxx:180
 AliXMLParser.cxx:181
 AliXMLParser.cxx:182
 AliXMLParser.cxx:183
 AliXMLParser.cxx:184
 AliXMLParser.cxx:185
 AliXMLParser.cxx:186
 AliXMLParser.cxx:187
 AliXMLParser.cxx:188
 AliXMLParser.cxx:189
 AliXMLParser.cxx:190
 AliXMLParser.cxx:191
 AliXMLParser.cxx:192
 AliXMLParser.cxx:193
 AliXMLParser.cxx:194
 AliXMLParser.cxx:195
 AliXMLParser.cxx:196
 AliXMLParser.cxx:197
 AliXMLParser.cxx:198
 AliXMLParser.cxx:199
 AliXMLParser.cxx:200
 AliXMLParser.cxx:201
 AliXMLParser.cxx:202
 AliXMLParser.cxx:203
 AliXMLParser.cxx:204
 AliXMLParser.cxx:205
 AliXMLParser.cxx:206
 AliXMLParser.cxx:207
 AliXMLParser.cxx:208
 AliXMLParser.cxx:209
 AliXMLParser.cxx:210
 AliXMLParser.cxx:211
 AliXMLParser.cxx:212
 AliXMLParser.cxx:213
 AliXMLParser.cxx:214
 AliXMLParser.cxx:215
 AliXMLParser.cxx:216
 AliXMLParser.cxx:217
 AliXMLParser.cxx:218
 AliXMLParser.cxx:219
 AliXMLParser.cxx:220
 AliXMLParser.cxx:221
 AliXMLParser.cxx:222
 AliXMLParser.cxx:223
 AliXMLParser.cxx:224
 AliXMLParser.cxx:225
 AliXMLParser.cxx:226
 AliXMLParser.cxx:227
 AliXMLParser.cxx:228
 AliXMLParser.cxx:229
 AliXMLParser.cxx:230
 AliXMLParser.cxx:231
 AliXMLParser.cxx:232
 AliXMLParser.cxx:233
 AliXMLParser.cxx:234
 AliXMLParser.cxx:235
 AliXMLParser.cxx:236
 AliXMLParser.cxx:237
 AliXMLParser.cxx:238
 AliXMLParser.cxx:239
 AliXMLParser.cxx:240
 AliXMLParser.cxx:241
 AliXMLParser.cxx:242
 AliXMLParser.cxx:243
 AliXMLParser.cxx:244
 AliXMLParser.cxx:245
 AliXMLParser.cxx:246
 AliXMLParser.cxx:247
 AliXMLParser.cxx:248
 AliXMLParser.cxx:249