ROOT logo
// @(#)root/xmlparser:$Id: TXMLParser.cxx 30749 2009-10-15 16:33:04Z brun $
// Author: Jose Lo   12/1/2005

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TXMLParser                                                           //
//                                                                      //
// TXMLParser is an abstract class which interfaces with Libxml2.       //
// Libxml2 is the XML C parser and toolkit developed for the Gnome      //
// project.                                                             //
//                                                                      //
// The libxml library provides two interfaces to the parser, a DOM      //
// style tree interface and a SAX style event based interface.          //
//                                                                      //
// TXMLParser is parent class of TSAXParser and TDOMParser, which are   //
// a SAX interface and DOM interface of libxml.                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

/*************************************************************************
  This source is based on libxml++, a C++ wrapper for the libxml XML
  parser library. Copyright (C) 2000 by Ari Johnson.

  libxml++ are copyright (C) 2000 by Ari Johnson, and are covered by the
  GNU Lesser General Public License, which should be included with
  libxml++ as the file COPYING.
 *************************************************************************/

#include "Riostream.h"
#include "TXMLParser.h"

#include <libxml/parser.h>


ClassImp(TXMLParser);

//______________________________________________________________________________
TXMLParser::TXMLParser()
  : fContext(0), fValidate(kTRUE), fReplaceEntities(kFALSE), fParseCode(0)
{
   // Initializes parser variables.

   xmlInitParser();
}

//______________________________________________________________________________
TXMLParser::~TXMLParser()
{
   // Cleanup.

   ReleaseUnderlying();
   fParseCode = 0;
}

//______________________________________________________________________________
void TXMLParser::SetValidate(Bool_t val)
{
   // The parser will validate the xml file if val = true.

   fValidate = val;
}

//______________________________________________________________________________
void TXMLParser::SetReplaceEntities(Bool_t val)
{
   // The parser will replace/expand entities.

   fReplaceEntities = val;
}

//______________________________________________________________________________
void TXMLParser::ReleaseUnderlying()
{
   // To release any existing document.

   if (fContext) {
      fContext->_private = 0;
      xmlFreeParserCtxt(fContext);
      fContext = 0;
   }
   xmlCleanupParser();
}

//______________________________________________________________________________
void TXMLParser::OnValidateError(const TString& message)
{
   // This function is called when an error from the parser has occured.
   // Message is the parse error.

   fValidateError += message;
}

//______________________________________________________________________________
void TXMLParser::OnValidateWarning(const TString& message)
{
   // This function is called when a warning from the parser has occured.
   // Message is the parse error.

   fValidateWarning += message;
}

//______________________________________________________________________________
const char *TXMLParser::GetParseCodeMessage(Int_t parseCode) const
{
   // Returns the parse code message.

   switch (parseCode) {
      case -1:
         return "Attempt to parse a second file while a parse is in progress";
         break;
      case -2:
         return "Parse context is not created";
         break;
      case -3:
         return "An error occured while parsing file";
         break;
      case -4:
         return "A fatal error occured while parsing file";
         break;
      case -5:
         return "Document is not well-formed";
         break;
      case -6:
         return "Document is not valid";
         break;
      default:
         return "Parse code does not exist";
   }
}

//______________________________________________________________________________
void TXMLParser::InitializeContext()
{
   // Initialize parser parameters, such as, disactivate non-standards libxml1
   // features, on/off validation, clear error and warning messages.

   fContext->linenumbers = 1; // TRUE - This is the default anyway.
   fContext->validate = fValidate ? 1 : 0;
   fContext->replaceEntities = fReplaceEntities ? 1 : 0;
   fContext->_private = this;

   fValidateError = "";
   fValidateWarning = "";
}

//______________________________________________________________________________
void TXMLParser::StopParser()
{
   // Stops parsing.

   if (fContext)
      xmlStopParser(fContext);
}

//______________________________________________________________________________
void TXMLParser::SetParseCode(Int_t errorcode)
{
   // Set the parse code:
   //  0: Parse succesfull
   // -1: Attempt to parse a second file while a parse is in progress
   // -2: Parse context is not created
   // -3: An error occured while parsing file
   // -4: A fatal error occured while parsing file
   // -5: Document is not well-formed

   fParseCode = errorcode;
}

//______________________________________________________________________________
void TXMLParser::SetStopOnError(Bool_t stop)
{
   // Set parser stops in case of error:
   // stop = true, stops on error
   // stop = false, continue parsing on error...

   fStopError = stop;
}
 TXMLParser.cxx:1
 TXMLParser.cxx:2
 TXMLParser.cxx:3
 TXMLParser.cxx:4
 TXMLParser.cxx:5
 TXMLParser.cxx:6
 TXMLParser.cxx:7
 TXMLParser.cxx:8
 TXMLParser.cxx:9
 TXMLParser.cxx:10
 TXMLParser.cxx:11
 TXMLParser.cxx:12
 TXMLParser.cxx:13
 TXMLParser.cxx:14
 TXMLParser.cxx:15
 TXMLParser.cxx:16
 TXMLParser.cxx:17
 TXMLParser.cxx:18
 TXMLParser.cxx:19
 TXMLParser.cxx:20
 TXMLParser.cxx:21
 TXMLParser.cxx:22
 TXMLParser.cxx:23
 TXMLParser.cxx:24
 TXMLParser.cxx:25
 TXMLParser.cxx:26
 TXMLParser.cxx:27
 TXMLParser.cxx:28
 TXMLParser.cxx:29
 TXMLParser.cxx:30
 TXMLParser.cxx:31
 TXMLParser.cxx:32
 TXMLParser.cxx:33
 TXMLParser.cxx:34
 TXMLParser.cxx:35
 TXMLParser.cxx:36
 TXMLParser.cxx:37
 TXMLParser.cxx:38
 TXMLParser.cxx:39
 TXMLParser.cxx:40
 TXMLParser.cxx:41
 TXMLParser.cxx:42
 TXMLParser.cxx:43
 TXMLParser.cxx:44
 TXMLParser.cxx:45
 TXMLParser.cxx:46
 TXMLParser.cxx:47
 TXMLParser.cxx:48
 TXMLParser.cxx:49
 TXMLParser.cxx:50
 TXMLParser.cxx:51
 TXMLParser.cxx:52
 TXMLParser.cxx:53
 TXMLParser.cxx:54
 TXMLParser.cxx:55
 TXMLParser.cxx:56
 TXMLParser.cxx:57
 TXMLParser.cxx:58
 TXMLParser.cxx:59
 TXMLParser.cxx:60
 TXMLParser.cxx:61
 TXMLParser.cxx:62
 TXMLParser.cxx:63
 TXMLParser.cxx:64
 TXMLParser.cxx:65
 TXMLParser.cxx:66
 TXMLParser.cxx:67
 TXMLParser.cxx:68
 TXMLParser.cxx:69
 TXMLParser.cxx:70
 TXMLParser.cxx:71
 TXMLParser.cxx:72
 TXMLParser.cxx:73
 TXMLParser.cxx:74
 TXMLParser.cxx:75
 TXMLParser.cxx:76
 TXMLParser.cxx:77
 TXMLParser.cxx:78
 TXMLParser.cxx:79
 TXMLParser.cxx:80
 TXMLParser.cxx:81
 TXMLParser.cxx:82
 TXMLParser.cxx:83
 TXMLParser.cxx:84
 TXMLParser.cxx:85
 TXMLParser.cxx:86
 TXMLParser.cxx:87
 TXMLParser.cxx:88
 TXMLParser.cxx:89
 TXMLParser.cxx:90
 TXMLParser.cxx:91
 TXMLParser.cxx:92
 TXMLParser.cxx:93
 TXMLParser.cxx:94
 TXMLParser.cxx:95
 TXMLParser.cxx:96
 TXMLParser.cxx:97
 TXMLParser.cxx:98
 TXMLParser.cxx:99
 TXMLParser.cxx:100
 TXMLParser.cxx:101
 TXMLParser.cxx:102
 TXMLParser.cxx:103
 TXMLParser.cxx:104
 TXMLParser.cxx:105
 TXMLParser.cxx:106
 TXMLParser.cxx:107
 TXMLParser.cxx:108
 TXMLParser.cxx:109
 TXMLParser.cxx:110
 TXMLParser.cxx:111
 TXMLParser.cxx:112
 TXMLParser.cxx:113
 TXMLParser.cxx:114
 TXMLParser.cxx:115
 TXMLParser.cxx:116
 TXMLParser.cxx:117
 TXMLParser.cxx:118
 TXMLParser.cxx:119
 TXMLParser.cxx:120
 TXMLParser.cxx:121
 TXMLParser.cxx:122
 TXMLParser.cxx:123
 TXMLParser.cxx:124
 TXMLParser.cxx:125
 TXMLParser.cxx:126
 TXMLParser.cxx:127
 TXMLParser.cxx:128
 TXMLParser.cxx:129
 TXMLParser.cxx:130
 TXMLParser.cxx:131
 TXMLParser.cxx:132
 TXMLParser.cxx:133
 TXMLParser.cxx:134
 TXMLParser.cxx:135
 TXMLParser.cxx:136
 TXMLParser.cxx:137
 TXMLParser.cxx:138
 TXMLParser.cxx:139
 TXMLParser.cxx:140
 TXMLParser.cxx:141
 TXMLParser.cxx:142
 TXMLParser.cxx:143
 TXMLParser.cxx:144
 TXMLParser.cxx:145
 TXMLParser.cxx:146
 TXMLParser.cxx:147
 TXMLParser.cxx:148
 TXMLParser.cxx:149
 TXMLParser.cxx:150
 TXMLParser.cxx:151
 TXMLParser.cxx:152
 TXMLParser.cxx:153
 TXMLParser.cxx:154
 TXMLParser.cxx:155
 TXMLParser.cxx:156
 TXMLParser.cxx:157
 TXMLParser.cxx:158
 TXMLParser.cxx:159
 TXMLParser.cxx:160
 TXMLParser.cxx:161
 TXMLParser.cxx:162
 TXMLParser.cxx:163
 TXMLParser.cxx:164
 TXMLParser.cxx:165
 TXMLParser.cxx:166
 TXMLParser.cxx:167
 TXMLParser.cxx:168
 TXMLParser.cxx:169
 TXMLParser.cxx:170
 TXMLParser.cxx:171
 TXMLParser.cxx:172
 TXMLParser.cxx:173
 TXMLParser.cxx:174
 TXMLParser.cxx:175
 TXMLParser.cxx:176
 TXMLParser.cxx:177
 TXMLParser.cxx:178
 TXMLParser.cxx:179
 TXMLParser.cxx:180
 TXMLParser.cxx:181
 TXMLParser.cxx:182
 TXMLParser.cxx:183
 TXMLParser.cxx:184
 TXMLParser.cxx:185