MpdXMLNode.cxx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. #include "MpdXMLNode.h"
  10. #include "TDOMParser.h"
  11. #include "TXMLEngine.h"
  12. #include <iostream>
  13. MpdXMLNode::MpdXMLNode(TString name,TString value) : TNamed(name, value){
  14. fChildren.SetOwner(kTRUE);
  15. fAttrib.SetOwner(kTRUE);
  16. }
  17. MpdXMLNode::MpdXMLNode(const MpdXMLNode& other):
  18. MpdXMLNode(other.GetName(),other.GetValue()){
  19. for(int i=0;i<other.fChildren.GetEntries();i++){
  20. fChildren.Add(new MpdXMLNode(*other.GetChild(i)));
  21. }
  22. for(int i=0;i<other.fAttrib.GetEntries();i++){
  23. fAttrib.Add(new MpdXMLAttrib(*other.GetAttrib(i)));
  24. }
  25. }
  26. MpdXMLNode& MpdXMLNode::operator =(const MpdXMLNode& other) {
  27. if(&other == this)
  28. return *this;
  29. SetName(other.GetName());
  30. SetValue(other.GetValue());
  31. fChildren.Clear();
  32. fAttrib.Clear();
  33. for(int i=0;i<other.fChildren.GetEntries();i++){
  34. fChildren.Add(new MpdXMLNode(*other.GetChild(i)));
  35. }
  36. for(int i=0;i<other.fAttrib.GetEntries();i++){
  37. fAttrib.Add(new MpdXMLAttrib(*other.GetAttrib(i)));
  38. }
  39. return *this;
  40. }
  41. void MpdXMLNode::Copy(TXMLNode* node){
  42. fChildren.Clear();
  43. fAttrib.Clear();
  44. SetName(node->GetNodeName());
  45. SetTitle(node->GetText());
  46. if(node->HasChildren()){
  47. TXMLNode *child = node->GetChildren();
  48. do{
  49. if(child==NULL) break;
  50. TString name = child->GetNodeName();
  51. if(name!="text"){//skip "text" nodes
  52. MpdXMLNode *tempnode = new MpdXMLNode();
  53. tempnode->Copy(child);
  54. fChildren.Add(tempnode);
  55. }
  56. if(child->HasNextNode())
  57. child=child->GetNextNode();
  58. }while(child->HasNextNode());
  59. }
  60. if(node->HasAttributes()){
  61. TList *atr_list = node->GetAttributes();
  62. for(int i=0;i<atr_list->GetEntries();i++){
  63. TXMLAttr *atrib = (TXMLAttr*)atr_list->At(i);
  64. fAttrib.Add(new MpdXMLAttrib(atrib->GetName(),atrib->GetValue()));
  65. }
  66. }
  67. }
  68. void MpdXMLNode::AddAttrib(MpdXMLAttrib* attrib) {
  69. TString new_atr = attrib->GetName();
  70. if(GetAttrib(new_atr)!=nullptr){
  71. std::cout<<"MpdXMLNode::AddAttrib Can't have two attributes with the same name!"<<std::endl;
  72. return;
  73. }
  74. fAttrib.AddLast(attrib);
  75. }
  76. Int_t MpdXMLNode::GetNChildren(TString name) const{
  77. Int_t counter =0;
  78. for(int i=0;i<GetNChildren();i++){
  79. TString name_temp = GetChild(i)->GetName();
  80. if(name_temp==name){
  81. counter++;
  82. }
  83. }
  84. return counter;
  85. }
  86. MpdXMLNode* MpdXMLNode::GetChild(TString name, Int_t count) const{
  87. Int_t control_index = 0;
  88. for(int i=0;i<fChildren.GetEntries();i++){
  89. MpdXMLNode *node = GetChild(i);
  90. TString temp = node->GetName();
  91. if(temp==name){
  92. control_index++;
  93. }
  94. if(control_index>count)
  95. return node;
  96. }
  97. return nullptr;
  98. }
  99. MpdXMLAttrib* MpdXMLNode::GetAttrib(TString name) const{
  100. return static_cast<MpdXMLAttrib*>(fAttrib.FindObject(name));
  101. }
  102. MpdXMLNode* MpdXMLNode::GetChild(Int_t index) const{
  103. return static_cast<MpdXMLNode*>(fChildren.At(index));
  104. }
  105. MpdXMLAttrib* MpdXMLNode::GetAttrib(Int_t index) const{
  106. return static_cast<MpdXMLAttrib*>(fAttrib.At(index));
  107. }
  108. MpdXMLNode::~MpdXMLNode() {
  109. }
  110. //---------- MpdXMLFile ------------------------------------------------------------------------------------
  111. MpdXMLFile::MpdXMLFile(TString name, TString mode) :fName(name){
  112. if(mode=="read"||mode=="READ"){
  113. fOverwrite = kFALSE;
  114. TDOMParser Parser;
  115. Parser.SetValidate(kFALSE);
  116. Parser.ParseFile(name);
  117. TXMLNode *MainNode = Parser.GetXMLDocument()->GetRootNode();
  118. fRootNode.reset(new MpdXMLNode());
  119. fRootNode->Copy(MainNode);
  120. }else{
  121. fOverwrite = kTRUE;
  122. }
  123. }
  124. void MpdXMLFile::CreateRootNode(TString name) {
  125. fRootNode.reset(new MpdXMLNode(name));
  126. }
  127. void MpdXMLFile::SetRootNode(MpdXMLNode *node) {
  128. fRootNode.reset(node);
  129. }
  130. void MpdXMLFile::Close() {
  131. if(fOverwrite){
  132. if(!fRootNode){
  133. std::cout<<"MpdXMLFile::Close() No root node!"<<std::endl;
  134. return;
  135. }
  136. TXMLEngine engine;
  137. XMLNodePointer_t mainnode = engine.NewChild(0, 0, fRootNode->GetName());
  138. ExportNode(mainnode,engine,*fRootNode.get());
  139. XMLDocPointer_t xmldoc = engine.NewDoc();
  140. engine.DocSetRootElement(xmldoc,mainnode);
  141. engine.SaveDoc(xmldoc,fName);
  142. engine.FreeDoc(xmldoc);
  143. fRootNode.reset(nullptr);
  144. }
  145. }
  146. void MpdXMLFile::ExportNode(XMLNodePointer_t& nodePointer,
  147. TXMLEngine &engine,const MpdXMLNode &node) const {
  148. for(int i=0;i<node.GetNChildren();i++){
  149. XMLNodePointer_t child = engine.NewChild(nodePointer,0,node.GetChild(i)->GetName(),node.GetChild(i)->GetValue());
  150. for(int j=0;j<node.GetChild(i)->GetNAttributes();j++){
  151. engine.NewAttr(child,0,node.GetChild(i)->GetAttrib(j)->GetName(),node.GetChild(i)->GetAttrib(j)->GetValue());
  152. }
  153. ExportNode(child,engine,*node.GetChild(i));
  154. }
  155. }
  156. MpdXMLFile::~MpdXMLFile() {
  157. if(fRootNode&&fOverwrite)
  158. Close();
  159. }