ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
vtkPVXMLParser.cxx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkPVXMLParser.cxx
5 
6  Copyright (c) Kitware, Inc.
7  All rights reserved.
8  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 #include "vtkPVXMLParser.h"
16 
17 #include "vtkNew.h"
18 #include "vtkObjectFactory.h"
19 #include "vtkPVXMLElement.h"
20 #include <sstream>
21 
23 
24 //----------------------------------------------------------------------------
26 {
27  this->InputString = 0;
28  this->NumberOfOpenElements = 0;
29  this->OpenElementsSize = 10;
30  this->OpenElements = new vtkPVXMLElement*[this->OpenElementsSize];
31  this->ElementIdIndex = 0;
32  this->RootElement = 0;
33  this->SuppressErrorMessages = 0;
34 }
35 
36 //----------------------------------------------------------------------------
38 {
39  unsigned int i;
40  for (i = 0; i < this->NumberOfOpenElements; ++i)
41  {
42  this->OpenElements[i]->Delete();
43  }
44  delete[] this->OpenElements;
45  if (this->RootElement)
46  {
47  this->RootElement->Delete();
48  }
49 }
50 
51 //----------------------------------------------------------------------------
52 void vtkPVXMLParser::PrintSelf(ostream& os, vtkIndent indent)
53 {
54  this->Superclass::PrintSelf(os, indent);
55  os << indent << "SuppressErrorMessages: " << this->SuppressErrorMessages << "\n";
56 }
57 
58 //----------------------------------------------------------------------------
59 void vtkPVXMLParser::StartElement(const char* name, const char** atts)
60 {
62  element->SetName(name);
63  element->ReadXMLAttributes(atts);
64  const char* id = element->GetAttribute("id");
65  if (id)
66  {
67  element->SetId(id);
68  }
69  else
70  {
71  std::ostringstream idstr;
72  idstr << this->ElementIdIndex++ << ends;
73  element->SetId(idstr.str().c_str());
74  }
75  this->PushOpenElement(element);
76 }
77 
78 //----------------------------------------------------------------------------
79 void vtkPVXMLParser::EndElement(const char* vtkNotUsed(name))
80 {
81  vtkPVXMLElement* finished = this->PopOpenElement();
82  unsigned int numOpen = this->NumberOfOpenElements;
83  if (numOpen > 0)
84  {
85  this->OpenElements[numOpen - 1]->AddNestedElement(finished);
86  finished->Delete();
87  }
88  else
89  {
90  this->RootElement = finished;
91  }
92 }
93 
94 //----------------------------------------------------------------------------
95 void vtkPVXMLParser::CharacterDataHandler(const char* data, int length)
96 {
97  unsigned int numOpen = this->NumberOfOpenElements;
98  if (numOpen > 0)
99  {
100  this->OpenElements[numOpen - 1]->AddCharacterData(data, length);
101  }
102 }
103 
104 //----------------------------------------------------------------------------
106 {
107  if (this->NumberOfOpenElements == this->OpenElementsSize)
108  {
109  unsigned int newSize = this->OpenElementsSize * 2;
110  vtkPVXMLElement** newOpenElements = new vtkPVXMLElement*[newSize];
111  unsigned int i;
112  for (i = 0; i < this->NumberOfOpenElements; ++i)
113  {
114  newOpenElements[i] = this->OpenElements[i];
115  }
116  delete[] this->OpenElements;
117  this->OpenElements = newOpenElements;
118  this->OpenElementsSize = newSize;
119  }
120 
121  unsigned int pos = this->NumberOfOpenElements++;
122  this->OpenElements[pos] = element;
123 }
124 
125 //----------------------------------------------------------------------------
127 {
128  if (this->NumberOfOpenElements > 0)
129  {
130  --this->NumberOfOpenElements;
131  return this->OpenElements[this->NumberOfOpenElements];
132  }
133  return 0;
134 }
135 
136 //----------------------------------------------------------------------------
137 void vtkPVXMLParser::PrintXML(ostream& os)
138 {
139  this->RootElement->PrintXML(os, vtkIndent());
140 }
141 
142 //----------------------------------------------------------------------------
144 {
145  if (this->RootElement)
146  {
147  this->RootElement->Delete();
148  this->RootElement = 0;
149  }
150  return this->Superclass::ParseXML();
151 }
152 
153 //----------------------------------------------------------------------------
155 {
156  return this->RootElement;
157 }
158 
159 //-----------------------------------------------------------------------------
161 {
162  if (!this->SuppressErrorMessages)
163  {
164  this->Superclass::ReportXmlParseError();
165  }
166 }
167 
168 //-----------------------------------------------------------------------------
170  const char* xmlcontents, bool suppress_errors)
171 {
173  vtkNew<vtkPVXMLParser> parser;
174  parser->SetSuppressErrorMessages(suppress_errors ? 1 : 0);
175  if (parser->Parse(xmlcontents))
176  {
177  root = parser->GetRootElement();
178  }
179  return root;
180 }
std::string name
void PrintXML(ostream &os, vtkIndent indent)
void AddNestedElement(vtkPVXMLElement *element, int setPrent)
void AddCharacterData(const char *data, int length)
void ReadXMLAttributes(const char **atts)
static vtkPVXMLElement * New()
const char * GetAttribute(const char *name)
void PrintSelf(ostream &os, vtkIndent indent) override
~vtkPVXMLParser() override
vtkPVXMLElement * PopOpenElement()
void ReportXmlParseError() override
vtkPVXMLElement * GetRootElement()
int ParseXML() override
unsigned int NumberOfOpenElements
vtkPVXMLElement ** OpenElements
void EndElement(const char *name) override
void PrintXML(ostream &os)
void PushOpenElement(vtkPVXMLElement *element)
unsigned int OpenElementsSize
unsigned int ElementIdIndex
void CharacterDataHandler(const char *data, int length) override
void StartElement(const char *name, const char **atts) override
vtkPVXMLElement * RootElement
GraphType data
Definition: graph_cut.cc:138
vtkStandardNewMacro(vtkPVXMLParser)