FlightGear next
FGXMLElement.h
Go to the documentation of this file.
1/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3 File: FGXMLElement.h
4 Author: Jon S. Berndt
5 Date started: 9/28/04
6
7 ------------- Copyright (C) 2004 Jon S. Berndt (jon@jsbsim.org) -------------
8
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU Lesser General Public License as published by the Free Software
11 Foundation; either version 2 of the License, or (at your option) any later
12 version.
13
14 This program is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17 details.
18
19 You should have received a copy of the GNU Lesser General Public License along with
20 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21 Place - Suite 330, Boston, MA 02111-1307, USA.
22
23 Further information about the GNU Lesser General Public License can also be found on
24 the world wide web at http://www.gnu.org.
25
26%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27SENTRY
28%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
29
30#ifndef XMLELEMENT_H
31#define XMLELEMENT_H
32
33/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34INCLUDES
35%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
36
37#include <string>
38#include <map>
39#include <vector>
40
41#include "simgear/structure/SGSharedPtr.hxx"
43
44/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45FORWARD DECLARATIONS
46%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
47
48namespace JSBSim {
49
50/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51CLASS DOCUMENTATION
52%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
53
135
136class Element;
137typedef SGSharedPtr<Element> Element_ptr;
138
139/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
140CLASS DECLARATION
141%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
142
143class Element : public SGReferenced {
144public:
148 Element(const std::string& nm);
150 ~Element(void);
151
155 bool HasAttribute(const std::string& key) {return attributes.find(key) != attributes.end();}
156
161 std::string GetAttributeValue(const std::string& key);
162
169 bool SetAttributeValue(const std::string& key, const std::string& value);
170
175 double GetAttributeValueAsNumber(const std::string& key);
176
179 const std::string& GetName(void) const {return name;}
180 void ChangeName(const std::string& _name) { name = _name; }
181
186 std::string GetDataLine(unsigned int i=0);
187
189 unsigned int GetNumDataLines(void) {return (unsigned int)data_lines.size();}
190
192 unsigned int GetNumElements(void) {return (unsigned int)children.size();}
193
195 unsigned int GetNumElements(const std::string& element_name);
196
202 double GetDataAsNumber(void);
203
211 Element* GetElement(unsigned int el=0);
212
221 Element* GetNextElement(void);
222
225 Element* GetParent(void) {return parent;}
226
230 int GetLineNumber(void) const { return line_number; }
231
235 const std::string& GetFileName(void) const { return file_name; }
236
243 Element* FindElement(const std::string& el="");
244
254 Element* FindNextElement(const std::string& el="");
255
264 std::string FindElementValue(const std::string& el="");
265
274 double FindElementValueAsNumber(const std::string& el="");
275
284 bool FindElementValueAsBoolean(const std::string& el="");
285
301 double FindElementValueAsNumberConvertTo(const std::string& el, const std::string& target_units);
302
320 double FindElementValueAsNumberConvertFromTo( const std::string& el,
321 const std::string& supplied_units,
322 const std::string& target_units);
323
333 FGColumnVector3 FindElementTripletConvertTo( const std::string& target_units);
334
335 double DisperseValue(Element *e, double val, const std::string& supplied_units="",
336 const std::string& target_units="");
337
341 void SetParent(Element* p) {parent = p;}
342
345 void AddChildElement(Element* el) {children.push_back(el);}
346
350 void AddAttribute(const std::string& name, const std::string& value);
351
354 void AddData(std::string d);
355
359 void Print(unsigned int level=0);
360
364 void SetLineNumber(int line) { line_number = line; }
365
369 void SetFileName(const std::string& name) { file_name = name; }
370
376 std::string ReadFrom(void) const;
377
385 void MergeAttributes(Element* el);
386
387private:
388 std::string name;
389 std::map <std::string, std::string> attributes;
390 std::vector <std::string> data_lines;
391 std::vector <Element_ptr> children;
392 Element *parent;
393 unsigned int element_index;
394 std::string file_name;
395 int line_number;
396 typedef std::map <std::string, std::map <std::string, double> > tMapConvert;
397 static tMapConvert convert;
398 static bool converterIsInitialized;
399};
400
401} // namespace JSBSim
402
403//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
404
405#endif
#define p(x)
#define i(x)
Element(const std::string &nm)
Constructor.
double FindElementValueAsNumberConvertTo(const std::string &el, const std::string &target_units)
Searches for the named element and converts and returns the data belonging to it.
const std::string & GetName(void) const
Retrieves the element name.
unsigned int GetNumElements(const std::string &element_name)
Returns the number of named child elements for this element.
void AddAttribute(const std::string &name, const std::string &value)
Stores an attribute belonging to this element.
double FindElementValueAsNumber(const std::string &el="")
Searches for the named element and returns the data belonging to it as a number.
FGColumnVector3 FindElementTripletConvertTo(const std::string &target_units)
Composes a 3-element column vector for the supplied location or orientation.
void SetParent(Element *p)
This function sets the value of the parent class attribute to the supplied Element pointer.
std::string ReadFrom(void) const
Return a string that contains a description of the location where the current XML element was read fr...
void Print(unsigned int level=0)
Prints the element.
Element * GetNextElement(void)
Returns a pointer to the next element in the list.
unsigned int GetNumDataLines(void)
Returns the number of lines of data stored.
double FindElementValueAsNumberConvertFromTo(const std::string &el, const std::string &supplied_units, const std::string &target_units)
Searches for the named element and converts and returns the data belonging to it.
double GetAttributeValueAsNumber(const std::string &key)
Retrieves an attribute value as a double precision real number.
bool FindElementValueAsBoolean(const std::string &el="")
Searches for the named element and returns the data belonging to it as a bool.
void AddChildElement(Element *el)
Adds a child element to the list of children stored for this element.
std::string FindElementValue(const std::string &el="")
Searches for the named element and returns the string data belonging to it.
void SetFileName(const std::string &name)
Set the name of the file in which the element has been read.
void ChangeName(const std::string &_name)
int GetLineNumber(void) const
Returns the line number at which the element has been defined.
~Element(void)
Destructor.
Element(const std::string &nm)
Constructor.
void AddData(std::string d)
Stores data belonging to this element.
std::string GetDataLine(unsigned int i=0)
Gets a line of data belonging to an element.
bool HasAttribute(const std::string &key)
Determines if an element has the supplied attribute.
Element * GetParent(void)
Returns a pointer to the parent of an element.
std::string GetAttributeValue(const std::string &key)
Retrieves an attribute.
unsigned int GetNumElements(void)
Returns the number of child elements for this element.
Element * GetElement(unsigned int el=0)
Returns a pointer to the element requested by index.
bool SetAttributeValue(const std::string &key, const std::string &value)
Modifies an attribute.
double GetDataAsNumber(void)
Converts the element data to a number.
double DisperseValue(Element *e, double val, const std::string &supplied_units="", const std::string &target_units="")
void MergeAttributes(Element *el)
Merges the attributes of the current element with another element.
Element * FindElement(const std::string &el="")
Searches for a specified element.
const std::string & GetFileName(void) const
Returns the name of the file in which the element has been read.
void SetLineNumber(int line)
Set the line number at which the element has been read.
Element * FindNextElement(const std::string &el="")
Searches for the next element as specified.
This class implements a 3 element column vector.
const char * name
SGSharedPtr< Element > Element_ptr