// Example to read and parse any xml file, supported by TXMLEngine class
// The input file, produced by xmlnewfile.C macro is used
// If you need full xml syntax support, use TXMLParser instead

#include "TXMLEngine.h"

void DisplayNode(TXMLEngine* xml, XMLNodePointer_t node, Int_t level);

void xmlreadfile(const char* filename = "example.xml")
{
   // First create engine
   TXMLEngine* xml = new TXMLEngine;
   
   // Now try to parse xml file
   // Only file with restricted xml syntax are supported
   XMLDocPointer_t xmldoc = xml->ParseFile(filename);
   if (xmldoc==0) {
      delete xml;
      return;  
   }

   // take access to main node   
   XMLNodePointer_t mainnode = xml->DocGetRootElement(xmldoc);
   
   // display recursively all nodes and subnodes
   DisplayNode(xml, mainnode, 1);
   
   // Release memory before exit
   xml->FreeDoc(xmldoc);
   delete xml;
}

void DisplayNode(TXMLEngine* xml, XMLNodePointer_t node, Int_t level) 
{
   // this function display all accessible information about xml node and its childs
   
   printf("%*c node: %s\n",level,' ', xml->GetNodeName(node));
   
   // display namespace
   XMLNsPointer_t ns = xml->GetNS(node);
   if (ns!=0)
      printf("%*c namespace: %s refer: %s\n",level+2,' ', xml->GetNSName(ns), xml->GetNSReference(ns));
   
   // display attributes
   XMLAttrPointer_t attr = xml->GetFirstAttr(node);
   while (attr!=0) {
       printf("%*c attr: %s value: %s\n",level+2,' ', xml->GetAttrName(attr), xml->GetAttrValue(attr));
       attr = xml->GetNextAttr(attr);  
   }
   
   // display content (if exists)
   const char* content = xml->GetNodeContent(node);
   if (content!=0) 
      printf("%*c cont: %s\n",level+2,' ', content);
      
   // display all child nodes   
   XMLNodePointer_t child = xml->GetChild(node);
   while (child!=0) {
      DisplayNode(xml, child, level+2); 
      child = xml->GetNext(child);
   }
}

