]> git.mxchange.org Git - simgear.git/blob - simgear/xml/easyxml.hxx
dc7297bef03c463e0a4ae0ddc805bd9ab041630c
[simgear.git] / simgear / xml / easyxml.hxx
1 /**
2  * \file easyxml.hxx
3  * Declarations for the SimGear XML parser.
4  * Written by David Megginson, 2000-2001
5  * This file is in the Public Domain, and comes with NO WARRANTY of any kind.
6  */
7
8 #ifndef __EASYXML_HXX
9 #define __EASYXML_HXX
10
11 #include <simgear/compiler.h>
12
13 #include STL_IOSTREAM
14 #include STL_STRING
15 #include <vector>
16
17 #if !defined(SG_HAVE_NATIVE_SGI_COMPILERS)
18 SG_USING_STD(istream);
19 #endif
20 SG_USING_STD(string);
21 SG_USING_STD(vector);
22
23
24 /**
25  * Interface for XML attributes.
26  *
27  * This interface is used to provide a list of attributes to the
28  * application.  The interface is a pure abstract class so that
29  * different implementations can be substituted for the sake of
30  * efficiency.
31  *
32  * @see XMLAttributesDefault
33  */
34 class XMLAttributes
35 {
36 public:
37
38   /**
39    * Constructor.
40    */
41   XMLAttributes ();
42
43
44   /**
45    * Destructor.
46    */
47   virtual ~ XMLAttributes ();
48
49
50   /**
51    * Get the number of attributes present.
52    *
53    * @return The number of attributes in the list (may be 0).
54    */
55   virtual int size () const = 0;
56
57
58   /**
59    * Get the name of an attribute by index.
60    *
61    * The index must be less than the size of the list and greater
62    * than or equal to zero.
63    *
64    * @param i The index of the attribute (zero-based).
65    * @see #size
66    */
67   virtual const char * getName (int i) const = 0;
68
69
70   /**
71    * Get the string value of an attribute by index.
72    *
73    * The index must be less than the size of the list and greater
74    * than or equal to zero.
75    *
76    * @param i The index of the attribute (zero-based).
77    * @see #size
78    */
79   virtual const char * getValue (int i) const = 0;
80
81
82   /**
83    * Look up the index of an attribute by name.
84    *
85    * Attribute names must be unique.  This method will return
86    * an index that can be used with the {@link #getValue(const char *)}
87    * method if the attribute is found.
88    *
89    * @param name The name of the attribute.
90    * @return The index of the attribute with the name specified,
91    * or -1 if no such attribute is present in the list.
92    */
93   virtual int findAttribute (const char * name) const;
94
95
96   /**
97    * Test whether an attribute is present.
98    *
99    * @param name The name of the attribute.
100    * @return true if an attribute with the specified name is present
101    * in the attribute list, false otherwise.
102    */
103   virtual bool hasAttribute (const char * name) const;
104
105
106   /**
107    * Look up the value of an attribute by name.
108    *
109    * This method provides a convenient short-cut to invoking
110    * {@link #findAttribute} and {@link #getValue(const char *)}.
111    *
112    * @param name The name of the attribute to look up.
113    * @return The attribute's value as a string, or 0 if no
114    * attribute was found with the name specified.
115    */
116   virtual const char * getValue (const char * name) const;
117 };
118
119
120 /**
121  * Default mutable attributes implementation.
122  *
123  * This class provides a default implementation of the {@link
124  * XMLAttributes} interface.  The implementation is mutable, so
125  * that it is possible to modify the attribute list when necessary.
126  * This class is particularly useful for taking a snapshot of
127  * an attribute list during parsing.
128  *
129  * @see XMLAttributes
130  */
131 class XMLAttributesDefault : public XMLAttributes
132 {
133 public:
134
135   /**
136    * Default constructor.
137    */
138   XMLAttributesDefault ();
139
140
141   /**
142    * Copy constructor.
143    *
144    * This constructor is especially useful for taking a static
145    * snapshot of an attribute list for later use.
146    *
147    * @param atts The attribute list to copy.
148    */
149   XMLAttributesDefault (const XMLAttributes & atts);
150
151
152   /**
153    * Destructor.
154    */
155   virtual ~XMLAttributesDefault ();
156
157
158   /**
159    * Count the attributes in the list.
160    */
161   virtual int size () const;
162
163
164   /**
165    * Get the name of an attribute by index.
166    */
167   virtual const char * getName (int i) const;
168
169
170   /**
171    * Get the value of an attribute by index.
172    */
173   virtual const char * getValue (int i) const;
174
175
176   /**
177    * Add an attribute to an attribute list.
178    *
179    * The name is required to be unique in the list; the value is not.
180    *
181    * @param name The name of the attribute to add.
182    * @param value The value of the attribute to add.
183    */
184   virtual void addAttribute (const char * name, const char * value);
185
186
187   /**
188    * Set an attribute name by index.
189    *
190    * This method will not extend the list; the attribute must
191    * already exist.
192    *
193    * @param i The index of the attribute (zero-based).
194    * @param name The new name.
195    */
196   virtual void setName (int i, const char * name);
197
198
199   /**
200    * Set an attribute value by index.
201    *
202    * This method will not extend the list; the attribute must
203    * already exist.
204    *
205    * @param i The index of the attribute (zero-based).
206    * @param value The new value.
207    */
208   virtual void setValue (int i, const char * value);
209
210
211   /**
212    * Set an attribute value by name.
213    *
214    * This method will not extend the list; the attribute must
215    * already exist.
216    *
217    * @param name The name of the attribute that will have the new
218    * value.
219    * @param value The new value.
220    */
221   virtual void setValue (const char * name, const char * value);
222
223 private:
224   vector<string> _atts;
225 };
226
227
228 /**
229  * Visitor class for an XML document.
230  *
231  * This interface uses the Visitor pattern.  The XML parser walks
232  * through the XML document and invokes the appropriate method in
233  * this visitor for each piece of markup it finds.  By default,
234  * the methods do nothing; the application must subclass the visitor
235  * and override the methods for the events it's interested in.
236  * All applications are required to provide an implementation
237  * for the {@link #error} callback.
238  */
239 class XMLVisitor
240 {
241 public:
242
243   /**
244    * Callback for the start of an XML document.
245    *
246    * The XML parser will invoke this method once, at the beginning of
247    * the XML document, before any other methods are invoked.  The
248    * application can use this callback to set up data structures,
249    * open files, etc.
250    *
251    * @see #endXML
252    */
253   virtual void startXML () {}
254
255
256   /**
257    * Callback for the end of an XML document.
258    *
259    * The XML parser will invoke this method once, at the end of the
260    * XML document, after all other methods are invoked, and only
261    * if there have been no parsing errors.  The application can use
262    * this callback to close or write files, finalize data structures,
263    * and so on, but the application will need to be prepared to 
264    * clean up any resources without this callback in the event of
265    * an error.
266    *
267    * @see #startXML
268    * @see #error
269    */
270   virtual void endXML () {}
271
272
273   /**
274    * Callback for the start of an XML element.
275    *
276    * The XML parser will invoke this method at the beginning of every
277    * XML element.  Start and end element calls will be balanced
278    * and properly nested: every element has both a start and end
279    * callback (even if it was specified with an XML empty element tag),
280    * there is exactly one root element, and every element must end 
281    * before its parent does.  Elements may not overlap.
282    * Note that the attribute list provided is volatile; it's contents
283    * are not guaranteed to persist after the end of the callback.
284    * If the application needs to keep a copy of the attribute list,
285    * it can make the copy with the {@link XMLAttributesDefault} class.
286    *
287    * @param name The name of the element that is starting (not null).
288    * @param atts The element's attributes (not null).
289    * @see #endElement
290    */
291   virtual void startElement (const char * name, const XMLAttributes &atts) {}
292
293
294   /**
295    * Callback for the end of an XML element.
296    *
297    * The XML parser will invoke this method at the end of every XML element.
298    *
299    * @param name The name of the element that is ending (not null).
300    * @see #startElement
301    */
302   virtual void endElement (const char * name) {}
303
304
305   /**
306    * Callback for a chunk of character data.
307    *
308    * The XML parser will invoke this method once for every chunk of
309    * character data in the XML document, including whitespace
310    * separating elements (as required by the XML recommendation).
311    * Note that character data may be chunked arbitrarily: the
312    * character data content of an element may be returned in one
313    * large chunk or several consecutive smaller chunks.
314    *
315    * @param s A pointer to the beginning of the character data (not null).
316    * @param length The number of characters in the chunk (may
317    * be zero).
318    */
319   virtual void data (const char * s, int length) {}
320
321
322   /**
323    * Callback for an XML processing instruction.
324    *
325    * The XML parser will invoke this method once for every processing
326    * instruction in the XML document.  Note that the XML declaration
327    * and the Text declaration are NOT PROCESSING INSTRUCTIONS and
328    * will not be reported through this callback.  Processing
329    * instructions are not all that useful, but the XML recommendation
330    * requires that they be reported.  Most applications can safely
331    * ignore this callback and use the empty default implementation.
332    *
333    * @param target The processing instruction target (not null).
334    * @param data The processing instruction data (not null).
335    */
336   virtual void pi (const char * target, const char * data) {}
337
338
339   /**
340    * Callback for an XML parsing warning.
341    *
342    * The XML parser will use this callback to report any non-fatal warnings
343    * during parsing.  It is the responsibility of the application to
344    * deal with the warning in some appropriate way.
345    *
346    * @param message The warning message from the parser.
347    * @param line The number of the line that generated the warning.
348    * @param column The character position in the line that generated
349    * the warning.
350    */
351   virtual void warning (const char * message, int line, int column) {}
352
353
354   /**
355    * Callback for a fatal XML parsing error.
356    *
357    * The XML parser will use this method to report any fatal errors
358    * during parsing.  Once the first error callback is received, 
359    * normal processing will stop, though additional errors may be
360    * reported.  The application should take any appropriate
361    * error-handling procedures when it receives this callback, and
362    * should not attempt to use any of the data found in the XML
363    * document.
364    *
365    * @param message The error message from the parser.
366    * @param line The number of the line that generated the error.
367    * @param column The character position in the line that generated
368    * the error.
369    */
370   virtual void error (const char * message, int line, int column) = 0;
371 };
372
373
374 /**
375  * @relates XMLVisitor
376  * Read an XML document.
377  *
378  * This function reads an XML document from the input stream provided,
379  * and invokes the callback methods in the visitor object to pass the 
380  * parsing events back to the application.  When this function
381  * returns, the parser will have reported all of the data in the XML
382  * document to the application through the visitor callback methods,
383  * and XML processing will be complete.
384  *
385  * @param input The byte input stream containing the XML document.
386  * @param visitor An object that contains callbacks for XML parsing
387  * events.
388  * @return true if the parse succeeded, false if there was a fatal
389  * error.
390  * @see XMLVisitor
391  */
392 extern bool readXML (istream &input, XMLVisitor &visitor);
393
394
395 #endif // __EASYXML_HXX
396