]> git.mxchange.org Git - simgear.git/blob - simgear/xml/easyxml.hxx
12cb7f502d829b4cf19e63bc2b112d825894ad04
[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    * Virtual destructor.
245    */
246   virtual ~XMLVisitor () {}
247
248
249   /**
250    * Callback for the start of an XML document.
251    *
252    * The XML parser will invoke this method once, at the beginning of
253    * the XML document, before any other methods are invoked.  The
254    * application can use this callback to set up data structures,
255    * open files, etc.
256    *
257    * @see #endXML
258    */
259   virtual void startXML () {}
260
261
262   /**
263    * Callback for the end of an XML document.
264    *
265    * The XML parser will invoke this method once, at the end of the
266    * XML document, after all other methods are invoked, and only
267    * if there have been no parsing errors.  The application can use
268    * this callback to close or write files, finalize data structures,
269    * and so on, but the application will need to be prepared to 
270    * clean up any resources without this callback in the event of
271    * an error.
272    *
273    * @see #startXML
274    * @see #error
275    */
276   virtual void endXML () {}
277
278
279   /**
280    * Callback for the start of an XML element.
281    *
282    * The XML parser will invoke this method at the beginning of every
283    * XML element.  Start and end element calls will be balanced
284    * and properly nested: every element has both a start and end
285    * callback (even if it was specified with an XML empty element tag),
286    * there is exactly one root element, and every element must end 
287    * before its parent does.  Elements may not overlap.
288    * Note that the attribute list provided is volatile; it's contents
289    * are not guaranteed to persist after the end of the callback.
290    * If the application needs to keep a copy of the attribute list,
291    * it can make the copy with the {@link XMLAttributesDefault} class.
292    *
293    * @param name The name of the element that is starting (not null).
294    * @param atts The element's attributes (not null).
295    * @see #endElement
296    */
297   virtual void startElement (const char * name, const XMLAttributes &atts) {}
298
299
300   /**
301    * Callback for the end of an XML element.
302    *
303    * The XML parser will invoke this method at the end of every XML element.
304    *
305    * @param name The name of the element that is ending (not null).
306    * @see #startElement
307    */
308   virtual void endElement (const char * name) {}
309
310
311   /**
312    * Callback for a chunk of character data.
313    *
314    * The XML parser will invoke this method once for every chunk of
315    * character data in the XML document, including whitespace
316    * separating elements (as required by the XML recommendation).
317    * Note that character data may be chunked arbitrarily: the
318    * character data content of an element may be returned in one
319    * large chunk or several consecutive smaller chunks.
320    *
321    * @param s A pointer to the beginning of the character data (not null).
322    * @param length The number of characters in the chunk (may
323    * be zero).
324    */
325   virtual void data (const char * s, int length) {}
326
327
328   /**
329    * Callback for an XML processing instruction.
330    *
331    * The XML parser will invoke this method once for every processing
332    * instruction in the XML document.  Note that the XML declaration
333    * and the Text declaration are NOT PROCESSING INSTRUCTIONS and
334    * will not be reported through this callback.  Processing
335    * instructions are not all that useful, but the XML recommendation
336    * requires that they be reported.  Most applications can safely
337    * ignore this callback and use the empty default implementation.
338    *
339    * @param target The processing instruction target (not null).
340    * @param data The processing instruction data (not null).
341    */
342   virtual void pi (const char * target, const char * data) {}
343
344
345   /**
346    * Callback for an XML parsing warning.
347    *
348    * The XML parser will use this callback to report any non-fatal warnings
349    * during parsing.  It is the responsibility of the application to
350    * deal with the warning in some appropriate way.
351    *
352    * @param message The warning message from the parser.
353    * @param line The number of the line that generated the warning.
354    * @param column The character position in the line that generated
355    * the warning.
356    */
357   virtual void warning (const char * message, int line, int column) {}
358
359
360   /**
361    * Callback for a fatal XML parsing error.
362    *
363    * The XML parser will use this method to report any fatal errors
364    * during parsing.  Once the first error callback is received, 
365    * normal processing will stop, though additional errors may be
366    * reported.  The application should take any appropriate
367    * error-handling procedures when it receives this callback, and
368    * should not attempt to use any of the data found in the XML
369    * document.
370    *
371    * @param message The error message from the parser.
372    * @param line The number of the line that generated the error.
373    * @param column The character position in the line that generated
374    * the error.
375    */
376   virtual void error (const char * message, int line, int column) = 0;
377 };
378
379
380 /**
381  * @relates XMLVisitor
382  * Read an XML document.
383  *
384  * This function reads an XML document from the input stream provided,
385  * and invokes the callback methods in the visitor object to pass the 
386  * parsing events back to the application.  When this function
387  * returns, the parser will have reported all of the data in the XML
388  * document to the application through the visitor callback methods,
389  * and XML processing will be complete.
390  *
391  * @param input The byte input stream containing the XML document.
392  * @param visitor An object that contains callbacks for XML parsing
393  * events.
394  * @return true if the parse succeeded, false if there was a fatal
395  * error.
396  * @see XMLVisitor
397  */
398 extern bool readXML (istream &input, XMLVisitor &visitor);
399
400
401 #endif // __EASYXML_HXX
402