Logo ROOT   6.14/05
Reference Guide
xmlmodifyfile.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_xml
3 /// \notebook -nodraw
4 /// Example to read, modify and store xml file, using TXMLEngine class
5 /// The input file, produced by xmlnewfile.C macro is used
6 /// If you need full xml syntax support, use TXMLParser instead
7 ///
8 /// \macro_output
9 /// \macro_code
10 ///
11 /// \author Sergey Linev
12 
13 #include "TXMLEngine.h"
14 
15 // scan node and returns number of childs
16 // for each child create info node with name and number of childs
17 int ScanNode(TXMLEngine &xml, XMLNodePointer_t node)
18 {
19  int cnt = 0;
20  XMLNodePointer_t child = xml.GetChild(node);
21  while (child) {
22  cnt++;
23 
24  int numsub = ScanNode(xml, child);
25 
26  // create new <info> node
27  XMLNodePointer_t info = xml.NewChild(node, xml.GetNS(child), "info");
28 
29  // set name and num attributes of info node
30  xml.NewAttr(info, 0, "name", xml.GetNodeName(child));
31  if (numsub > 0) xml.NewIntAttr(info, "num", numsub);
32 
33  // move it after current node
34  xml.AddChildAfter(node, info, child);
35 
36  // set pointer to new node
37  child = info;
38 
39  xml.ShiftToNext(child);
40  }
41  return cnt;
42 }
43 
44 void xmlmodifyfile(const char* filename = "example.xml")
45 {
46  // First create engine
47  TXMLEngine xml;
48 
49  // Now try to parse xml file
50  XMLDocPointer_t xmldoc = xml.ParseFile(filename);
51  if (xmldoc) {
52  // recursively scan all nodes, insert new when required
53  ScanNode(xml, xml.DocGetRootElement(xmldoc));
54 
55  // Save document to file
56  xml.SaveDoc(xmldoc, "modify.xml");
57 
58  // Release memory before exit
59  xml.FreeDoc(xmldoc);
60  }
61 }
void AddChildAfter(XMLNodePointer_t parent, XMLNodePointer_t child, XMLNodePointer_t afternode)
Insert new child node after already existing node.
Definition: TXMLEngine.cxx:838
XMLNsPointer_t GetNS(XMLNodePointer_t xmlnode)
return namespace attribute (if exists)
Definition: TXMLEngine.cxx:758
void FreeDoc(XMLDocPointer_t xmldoc)
frees allocated document data and deletes document itself
XMLAttrPointer_t NewIntAttr(XMLNodePointer_t xmlnode, const char *name, Int_t value)
create node attribute with integer value
Definition: TXMLEngine.cxx:604
void * XMLDocPointer_t
Definition: TXMLEngine.h:20
const char * GetNodeName(XMLNodePointer_t xmlnode)
returns name of xmlnode
void SaveDoc(XMLDocPointer_t xmldoc, const char *filename, Int_t layout=1)
store document content to file if layout<=0, no any spaces or newlines will be placed between xmlnode...
void ShiftToNext(XMLNodePointer_t &xmlnode, Bool_t realnode=kTRUE)
shifts specified node to next if realnode==kTRUE, any special nodes in between will be skipped ...
void * XMLNodePointer_t
Definition: TXMLEngine.h:17
XMLDocPointer_t ParseFile(const char *filename, Int_t maxbuf=100000)
Parses content of file and tries to produce xml structures.
XMLAttrPointer_t NewAttr(XMLNodePointer_t xmlnode, XMLNsPointer_t, const char *name, const char *value)
creates new attribute for xmlnode, namespaces are not supported for attributes
Definition: TXMLEngine.cxx:578
XMLNodePointer_t GetChild(XMLNodePointer_t xmlnode, Bool_t realnode=kTRUE)
returns first child of xmlnode
XMLNodePointer_t NewChild(XMLNodePointer_t parent, XMLNsPointer_t ns, const char *name, const char *content=0)
create new child element for parent node
Definition: TXMLEngine.cxx:707
XMLNodePointer_t DocGetRootElement(XMLDocPointer_t xmldoc)
returns root node of document
const char * cnt
Definition: TXMLSetup.cxx:74