ROOT logo
// @(#)root/xmlparser:$Id: TXMLNode.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Jose Lo   12/4/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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TXMLNode                                                             //
//                                                                      //
// TXMLNode contains a pointer to xmlNode, which is a node under the    //
// DOM tree. A node can be an Element, an Attribute, a Text Node        //
// or a Comment Node.                                                   //
// One can navigate the DOM tree by accessing the siblings and          //
// parent or child nodes. Also retriving the Attribute or the Text in   //
// an Element node.                                                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TXMLNode.h"
#include "TXMLAttr.h"
#include "TList.h"
#include <libxml/tree.h>


ClassImp(TXMLNode);

//______________________________________________________________________________
TXMLNode::TXMLNode(xmlNode *node, TXMLNode *parent, TXMLNode *previous) :
   fXMLNode(node), fParent(parent), fChildren(0), fNextNode(0),
   fPreviousNode(previous), fAttrList(0)
{
   // TXMLNode constructor.
}

//______________________________________________________________________________
TXMLNode::~TXMLNode()
{
   // Destructor. It deletes the node's child, next sibling and the
   // attribute list.

   delete fChildren;
   delete fNextNode;
   if (fAttrList)
      fAttrList->Delete();
   delete fAttrList;

}

//______________________________________________________________________________
TXMLNode::EXMLElementType TXMLNode::GetNodeType() const
{
   // Returns the node's type.

   return (TXMLNode::EXMLElementType) fXMLNode->type;
}

//______________________________________________________________________________
const char *TXMLNode::GetNodeName() const
{
   // Returns the node's name.

   return (const char *) fXMLNode->name;
}

//______________________________________________________________________________
TXMLNode *TXMLNode::GetChildren()
{
   // Returns the node's child if any, returns 0 if no child.

   if (fChildren)
      return fChildren;

   if (fXMLNode->children){
      fChildren = new TXMLNode(fXMLNode->children, this);
      return fChildren;
   }
   return 0;
}

//______________________________________________________________________________
TXMLNode *TXMLNode::GetParent() const
{
   // Returns the node's parent if any, returns 0 if no parent.

   return fParent;
}

//______________________________________________________________________________
const char *TXMLNode::GetContent() const
{
   // Returns the content if any, or 0.

   if (fXMLNode->content)
      return (const char *) fXMLNode->content;
   return 0;
}

//______________________________________________________________________________
TList *TXMLNode::GetAttributes()
{
   // Returns a list of node's attribute if any,
   // returns 0 if no attribute.

   if (fAttrList)
      return fAttrList;

   if (!HasAttributes())
      return 0;

   fAttrList = new TList();
   xmlAttr *attr_node = fXMLNode->properties;
   for (; attr_node; attr_node = attr_node->next) {
      fAttrList->Add(new TXMLAttr((const char *) attr_node->name,
                                  (const char *) attr_node->children->content));
   }

   return fAttrList;
}

//______________________________________________________________________________
TXMLNode *TXMLNode::GetNextNode()
{
   // Returns the next sibling XMLNode in the DOM tree, if any
   // return 0 if no next node.

   if (fNextNode)
      return fNextNode;

   if (fXMLNode->next) {
      fNextNode = new TXMLNode(fXMLNode->next, fParent, this);
      return fNextNode;
   }
   return 0;
}

//______________________________________________________________________________
TXMLNode *TXMLNode::GetPreviousNode() const
{
   // Returns the previous sibling XMLNode in the DOM tree, if any
   // return 0 if no previous node

   return fPreviousNode;
}

//______________________________________________________________________________
const char *TXMLNode::GetText() const
{
   // Returns the content of a Text node if node is a TextNode, 0 otherwise.

   if (GetNodeType() == kXMLElementNode && HasChildren()) {
      if (fXMLNode->children->type == XML_TEXT_NODE)
         return (const char *) fXMLNode->children->content;
   }
   return 0;
}

//______________________________________________________________________________
Bool_t TXMLNode::HasChildren() const
{
   // Returns true if node has children.

   return fXMLNode->children ? kTRUE : kFALSE;
}

//______________________________________________________________________________
Bool_t TXMLNode::HasNextNode() const
{
   // Returns true if has next node.

   return fXMLNode->next ? kTRUE : kFALSE;
}

//______________________________________________________________________________
Bool_t TXMLNode::HasParent() const
{
   // Returns true if node has parent.

   return fXMLNode->parent ? kTRUE : kFALSE;
}

//______________________________________________________________________________
Bool_t TXMLNode::HasPreviousNode() const
{
   // Returns true if has previous node.

   return fXMLNode->prev ? kTRUE : kFALSE;
}

//______________________________________________________________________________
Bool_t TXMLNode::HasAttributes() const
{
   // Returns true if Element node has attribute.

   return fXMLNode->properties ? kTRUE : kFALSE;
}

//______________________________________________________________________________
const char *TXMLNode::GetNamespaceHref() const
{
   // Returns the URL for the namespace, or 0 if no namespace.

   if (fXMLNode->ns) {
      return (const char *) fXMLNode->ns->href;
   }
   return 0;
}

//______________________________________________________________________________
const char *TXMLNode::GetNamespacePrefix() const
{
   // Returns prefix for the namespace, or 0 if no namespace.

   if (fXMLNode->ns) {
      return (const char *) fXMLNode->ns->prefix;
   }
   return 0;
}
 TXMLNode.cxx:1
 TXMLNode.cxx:2
 TXMLNode.cxx:3
 TXMLNode.cxx:4
 TXMLNode.cxx:5
 TXMLNode.cxx:6
 TXMLNode.cxx:7
 TXMLNode.cxx:8
 TXMLNode.cxx:9
 TXMLNode.cxx:10
 TXMLNode.cxx:11
 TXMLNode.cxx:12
 TXMLNode.cxx:13
 TXMLNode.cxx:14
 TXMLNode.cxx:15
 TXMLNode.cxx:16
 TXMLNode.cxx:17
 TXMLNode.cxx:18
 TXMLNode.cxx:19
 TXMLNode.cxx:20
 TXMLNode.cxx:21
 TXMLNode.cxx:22
 TXMLNode.cxx:23
 TXMLNode.cxx:24
 TXMLNode.cxx:25
 TXMLNode.cxx:26
 TXMLNode.cxx:27
 TXMLNode.cxx:28
 TXMLNode.cxx:29
 TXMLNode.cxx:30
 TXMLNode.cxx:31
 TXMLNode.cxx:32
 TXMLNode.cxx:33
 TXMLNode.cxx:34
 TXMLNode.cxx:35
 TXMLNode.cxx:36
 TXMLNode.cxx:37
 TXMLNode.cxx:38
 TXMLNode.cxx:39
 TXMLNode.cxx:40
 TXMLNode.cxx:41
 TXMLNode.cxx:42
 TXMLNode.cxx:43
 TXMLNode.cxx:44
 TXMLNode.cxx:45
 TXMLNode.cxx:46
 TXMLNode.cxx:47
 TXMLNode.cxx:48
 TXMLNode.cxx:49
 TXMLNode.cxx:50
 TXMLNode.cxx:51
 TXMLNode.cxx:52
 TXMLNode.cxx:53
 TXMLNode.cxx:54
 TXMLNode.cxx:55
 TXMLNode.cxx:56
 TXMLNode.cxx:57
 TXMLNode.cxx:58
 TXMLNode.cxx:59
 TXMLNode.cxx:60
 TXMLNode.cxx:61
 TXMLNode.cxx:62
 TXMLNode.cxx:63
 TXMLNode.cxx:64
 TXMLNode.cxx:65
 TXMLNode.cxx:66
 TXMLNode.cxx:67
 TXMLNode.cxx:68
 TXMLNode.cxx:69
 TXMLNode.cxx:70
 TXMLNode.cxx:71
 TXMLNode.cxx:72
 TXMLNode.cxx:73
 TXMLNode.cxx:74
 TXMLNode.cxx:75
 TXMLNode.cxx:76
 TXMLNode.cxx:77
 TXMLNode.cxx:78
 TXMLNode.cxx:79
 TXMLNode.cxx:80
 TXMLNode.cxx:81
 TXMLNode.cxx:82
 TXMLNode.cxx:83
 TXMLNode.cxx:84
 TXMLNode.cxx:85
 TXMLNode.cxx:86
 TXMLNode.cxx:87
 TXMLNode.cxx:88
 TXMLNode.cxx:89
 TXMLNode.cxx:90
 TXMLNode.cxx:91
 TXMLNode.cxx:92
 TXMLNode.cxx:93
 TXMLNode.cxx:94
 TXMLNode.cxx:95
 TXMLNode.cxx:96
 TXMLNode.cxx:97
 TXMLNode.cxx:98
 TXMLNode.cxx:99
 TXMLNode.cxx:100
 TXMLNode.cxx:101
 TXMLNode.cxx:102
 TXMLNode.cxx:103
 TXMLNode.cxx:104
 TXMLNode.cxx:105
 TXMLNode.cxx:106
 TXMLNode.cxx:107
 TXMLNode.cxx:108
 TXMLNode.cxx:109
 TXMLNode.cxx:110
 TXMLNode.cxx:111
 TXMLNode.cxx:112
 TXMLNode.cxx:113
 TXMLNode.cxx:114
 TXMLNode.cxx:115
 TXMLNode.cxx:116
 TXMLNode.cxx:117
 TXMLNode.cxx:118
 TXMLNode.cxx:119
 TXMLNode.cxx:120
 TXMLNode.cxx:121
 TXMLNode.cxx:122
 TXMLNode.cxx:123
 TXMLNode.cxx:124
 TXMLNode.cxx:125
 TXMLNode.cxx:126
 TXMLNode.cxx:127
 TXMLNode.cxx:128
 TXMLNode.cxx:129
 TXMLNode.cxx:130
 TXMLNode.cxx:131
 TXMLNode.cxx:132
 TXMLNode.cxx:133
 TXMLNode.cxx:134
 TXMLNode.cxx:135
 TXMLNode.cxx:136
 TXMLNode.cxx:137
 TXMLNode.cxx:138
 TXMLNode.cxx:139
 TXMLNode.cxx:140
 TXMLNode.cxx:141
 TXMLNode.cxx:142
 TXMLNode.cxx:143
 TXMLNode.cxx:144
 TXMLNode.cxx:145
 TXMLNode.cxx:146
 TXMLNode.cxx:147
 TXMLNode.cxx:148
 TXMLNode.cxx:149
 TXMLNode.cxx:150
 TXMLNode.cxx:151
 TXMLNode.cxx:152
 TXMLNode.cxx:153
 TXMLNode.cxx:154
 TXMLNode.cxx:155
 TXMLNode.cxx:156
 TXMLNode.cxx:157
 TXMLNode.cxx:158
 TXMLNode.cxx:159
 TXMLNode.cxx:160
 TXMLNode.cxx:161
 TXMLNode.cxx:162
 TXMLNode.cxx:163
 TXMLNode.cxx:164
 TXMLNode.cxx:165
 TXMLNode.cxx:166
 TXMLNode.cxx:167
 TXMLNode.cxx:168
 TXMLNode.cxx:169
 TXMLNode.cxx:170
 TXMLNode.cxx:171
 TXMLNode.cxx:172
 TXMLNode.cxx:173
 TXMLNode.cxx:174
 TXMLNode.cxx:175
 TXMLNode.cxx:176
 TXMLNode.cxx:177
 TXMLNode.cxx:178
 TXMLNode.cxx:179
 TXMLNode.cxx:180
 TXMLNode.cxx:181
 TXMLNode.cxx:182
 TXMLNode.cxx:183
 TXMLNode.cxx:184
 TXMLNode.cxx:185
 TXMLNode.cxx:186
 TXMLNode.cxx:187
 TXMLNode.cxx:188
 TXMLNode.cxx:189
 TXMLNode.cxx:190
 TXMLNode.cxx:191
 TXMLNode.cxx:192
 TXMLNode.cxx:193
 TXMLNode.cxx:194
 TXMLNode.cxx:195
 TXMLNode.cxx:196
 TXMLNode.cxx:197
 TXMLNode.cxx:198
 TXMLNode.cxx:199
 TXMLNode.cxx:200
 TXMLNode.cxx:201
 TXMLNode.cxx:202
 TXMLNode.cxx:203
 TXMLNode.cxx:204
 TXMLNode.cxx:205
 TXMLNode.cxx:206
 TXMLNode.cxx:207
 TXMLNode.cxx:208
 TXMLNode.cxx:209
 TXMLNode.cxx:210
 TXMLNode.cxx:211
 TXMLNode.cxx:212
 TXMLNode.cxx:213
 TXMLNode.cxx:214
 TXMLNode.cxx:215
 TXMLNode.cxx:216
 TXMLNode.cxx:217
 TXMLNode.cxx:218
 TXMLNode.cxx:219
 TXMLNode.cxx:220
 TXMLNode.cxx:221
 TXMLNode.cxx:222
 TXMLNode.cxx:223