BmnRoot
Loading...
Searching...
No Matches
MpdXMLNode.cxx
Go to the documentation of this file.
1/*
2 * MpdXMLNode.cxx
3 *
4 * Created on: 01-10-2013
5 * Author: Daniel Wielanek
6 * E-mail: daniel.wielanek@gmail.com
7 * Warsaw University of Technology, Faculty of Physics
8 */
9
10#include "MpdXMLNode.h"
11#include "TDOMParser.h"
12#include "TXMLEngine.h"
13#include <iostream>
14
15
16MpdXMLNode::MpdXMLNode(TString name,TString value) : TNamed(name, value){
17 fChildren.SetOwner(kTRUE);
18 fAttrib.SetOwner(kTRUE);
19}
20
22 MpdXMLNode(other.GetName(),other.GetValue()){
23 for(int i=0;i<other.fChildren.GetEntries();i++){
24 fChildren.Add(new MpdXMLNode(*other.GetChild(i)));
25 }
26 for(int i=0;i<other.fAttrib.GetEntries();i++){
27 fAttrib.Add(new MpdXMLAttrib(*other.GetAttrib(i)));
28 }
29}
30
32 if(&other == this)
33 return *this;
34 SetName(other.GetName());
35 SetValue(other.GetValue());
36 fChildren.Clear();
37 fAttrib.Clear();
38 for(int i=0;i<other.fChildren.GetEntries();i++){
39 fChildren.Add(new MpdXMLNode(*other.GetChild(i)));
40 }
41 for(int i=0;i<other.fAttrib.GetEntries();i++){
42 fAttrib.Add(new MpdXMLAttrib(*other.GetAttrib(i)));
43 }
44 return *this;
45}
46
47void MpdXMLNode::Copy(TXMLNode* node){
48 fChildren.Clear();
49 fAttrib.Clear();
50 SetName(node->GetNodeName());
51 SetTitle(node->GetText());
52 if(node->HasChildren()){
53 TXMLNode *child = node->GetChildren();
54 do{
55 if(child==NULL) break;
56 TString name = child->GetNodeName();
57 if(name!="text"){//skip "text" nodes
58 MpdXMLNode *tempnode = new MpdXMLNode();
59 tempnode->Copy(child);
60 fChildren.Add(tempnode);
61 }
62 if(child->HasNextNode())
63 child=child->GetNextNode();
64 }while(child->HasNextNode());
65 }
66 if(node->HasAttributes()){
67 TList *atr_list = node->GetAttributes();
68 for(int i=0;i<atr_list->GetEntries();i++){
69 TXMLAttr *atrib = (TXMLAttr*)atr_list->At(i);
70 fAttrib.Add(new MpdXMLAttrib(atrib->GetName(),atrib->GetValue()));
71 }
72 }
73}
74
76 TString new_atr = attrib->GetName();
77 if(GetAttrib(new_atr)!=nullptr){
78 std::cout<<"MpdXMLNode::AddAttrib Can't have two attributes with the same name!"<<std::endl;
79 return;
80 }
81 fAttrib.AddLast(attrib);
82}
83
84Int_t MpdXMLNode::GetNChildren(TString name) const{
85 Int_t counter =0;
86 for(int i=0;i<GetNChildren();i++){
87 TString name_temp = GetChild(i)->GetName();
88 if(name_temp==name){
89 counter++;
90 }
91 }
92 return counter;
93}
94
95MpdXMLNode* MpdXMLNode::GetChild(TString name, Int_t count) const{
96 Int_t control_index = 0;
97 for(int i=0;i<fChildren.GetEntries();i++){
98 MpdXMLNode *node = GetChild(i);
99 TString temp = node->GetName();
100 if(temp==name){
101 control_index++;
102 }
103 if(control_index>count)
104 return node;
105 }
106 return nullptr;
107}
108
110 return static_cast<MpdXMLAttrib*>(fAttrib.FindObject(name));
111}
112
114 return static_cast<MpdXMLNode*>(fChildren.At(index));
115}
116
118 return static_cast<MpdXMLAttrib*>(fAttrib.At(index));
119}
120
123
124//---------- MpdXMLFile ------------------------------------------------------------------------------------
125
126MpdXMLFile::MpdXMLFile(TString name, TString mode) :fName(name){
127 if(mode=="read"||mode=="READ"){
128 fOverwrite = kFALSE;
129 TDOMParser Parser;
130 Parser.SetValidate(kFALSE);
131 Parser.ParseFile(name);
132 TXMLNode *MainNode = Parser.GetXMLDocument()->GetRootNode();
133 fRootNode.reset(new MpdXMLNode());
134 fRootNode->Copy(MainNode);
135 }else{
136 fOverwrite = kTRUE;
137 }
138}
139
140void MpdXMLFile::CreateRootNode(TString name) {
141 fRootNode.reset(new MpdXMLNode(name));
142}
143
145 fRootNode.reset(node);
146}
147
149 if(fOverwrite){
150 if(!fRootNode){
151 std::cout<<"MpdXMLFile::Close() No root node!"<<std::endl;
152 return;
153 }
154 TXMLEngine engine;
155 XMLNodePointer_t mainnode = engine.NewChild(0, 0, fRootNode->GetName());
156 ExportNode(mainnode,engine,*fRootNode.get());
157 XMLDocPointer_t xmldoc = engine.NewDoc();
158 engine.DocSetRootElement(xmldoc,mainnode);
159 engine.SaveDoc(xmldoc,fName);
160 engine.FreeDoc(xmldoc);
161 fRootNode.reset(nullptr);
162 }
163}
164
165void MpdXMLFile::ExportNode(XMLNodePointer_t& nodePointer,
166 TXMLEngine &engine,const MpdXMLNode &node) const {
167 for(int i=0;i<node.GetNChildren();i++){
168 XMLNodePointer_t child = engine.NewChild(nodePointer,0,node.GetChild(i)->GetName(),node.GetChild(i)->GetValue());
169 for(int j=0;j<node.GetChild(i)->GetNAttributes();j++){
170 engine.NewAttr(child,0,node.GetChild(i)->GetAttrib(j)->GetName(),node.GetChild(i)->GetAttrib(j)->GetValue());
171 }
172 ExportNode(child,engine,*node.GetChild(i));
173 }
174}
175
177 if(fRootNode&&fOverwrite)
178 Close();
179}
int i
Definition P4_F32vec4.h:22
TString GetValue() const
Definition MpdXMLNode.h:38
void CreateRootNode(TString name)
MpdXMLFile(TString name="", TString mode="read")
void SetRootNode(MpdXMLNode *node)
virtual ~MpdXMLFile()
void AddAttrib(MpdXMLAttrib *attrib)
TString GetValue() const
Definition MpdXMLNode.h:112
void Copy(TXMLNode *node)
MpdXMLNode & operator=(const MpdXMLNode &other)
MpdXMLNode * GetChild(TString name, Int_t count=0) const
MpdXMLAttrib * GetAttrib(TString name) const
Int_t GetNChildren() const
Definition MpdXMLNode.h:96
virtual ~MpdXMLNode()
MpdXMLNode(const MpdXMLNode &other)
void SetValue(TString value)
Definition MpdXMLNode.h:80