Mbed port of the Simple Plain Xml parser. See http://code.google.com/p/spxml/ for more details. This library uses less memory and is much better suited to streaming data than TinyXML (doesn\'t use as much C++ features, and especially works without streams). See http://mbed.org/users/hlipka/notebook/xml-parsing/ for usage examples.

Dependents:   spxmltest_weather VFD_fontx2_weather weather_LCD_display News_LCD_display ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers spxmlnode.cpp Source File

spxmlnode.cpp

00001 /*
00002  * Copyright 2007 Stephen Liu
00003  * LGPL, see http://code.google.com/p/spxml/
00004  * For license terms, see the file COPYING along with this library.
00005  */
00006 
00007 #include <string.h>
00008 #include <stdlib.h>
00009 
00010 #include "spxmlnode.hpp"
00011 #include "spxmlutils.hpp"
00012 #include "spxmlevent.hpp"
00013 
00014 //=========================================================
00015 
00016 SP_XmlNode :: SP_XmlNode( int type )
00017     : mType( type )
00018 {
00019     mParent = NULL;
00020 }
00021 
00022 SP_XmlNode :: ~SP_XmlNode()
00023 {
00024     mParent = NULL;
00025 }
00026 
00027 void SP_XmlNode :: setParent( SP_XmlNode * parent )
00028 {
00029     mParent = parent;
00030 }
00031 
00032 const SP_XmlNode * SP_XmlNode :: getParent() const
00033 {
00034     return mParent;
00035 }
00036 
00037 int SP_XmlNode :: getType() const
00038 {
00039     return mType;
00040 }
00041 
00042 //=========================================================
00043 
00044 SP_XmlNodeList :: SP_XmlNodeList()
00045 {
00046     mList = new SP_XmlArrayList();
00047 }
00048 
00049 SP_XmlNodeList :: ~SP_XmlNodeList()
00050 {
00051     for( int i = 0; i < mList->getCount(); i++ ) {
00052         SP_XmlNode * node = (SP_XmlNode*)mList->getItem( i );
00053         delete node;
00054     }
00055 
00056     delete mList;
00057 
00058     mList = NULL;
00059 }
00060 
00061 int SP_XmlNodeList :: getLength() const
00062 {
00063     return mList->getCount();
00064 }
00065 
00066 void SP_XmlNodeList :: append( SP_XmlNode * node )
00067 {
00068     mList->append( node );
00069 }
00070 
00071 SP_XmlNode * SP_XmlNodeList :: get( int index ) const
00072 {
00073     return (SP_XmlNode*)mList->getItem( index );
00074 }
00075 
00076 SP_XmlNode * SP_XmlNodeList :: take( int index ) const
00077 {
00078     return (SP_XmlNode*)mList->takeItem( index );
00079 }
00080 
00081 //=========================================================
00082 
00083 SP_XmlDocument :: SP_XmlDocument()
00084     : SP_XmlNode( eXMLDOC )
00085 {
00086     mDocDecl = NULL;
00087     mDocType = NULL;
00088     mChildren = new SP_XmlNodeList();
00089 }
00090 
00091 SP_XmlDocument :: ~SP_XmlDocument()
00092 {
00093     if( NULL != mDocDecl ) delete mDocDecl;
00094     mDocDecl = NULL;
00095 
00096     if( NULL != mDocType ) delete mDocType;
00097     mDocType = NULL;
00098 
00099     if( NULL != mChildren ) delete mChildren;
00100     mChildren = NULL;
00101 }
00102 
00103 void SP_XmlDocument :: setDocDecl( SP_XmlDocDeclNode * docDecl )
00104 {
00105     if( NULL != mDocDecl ) delete mDocDecl;
00106     docDecl->setParent( this );
00107     mDocDecl = docDecl;
00108 }
00109 
00110 SP_XmlDocDeclNode * SP_XmlDocument :: getDocDecl() const
00111 {
00112     return mDocDecl;
00113 }
00114 
00115 void SP_XmlDocument :: setDocType( SP_XmlDocTypeNode * docType )
00116 {
00117     if( NULL != mDocType ) delete mDocType;
00118     docType->setParent( this );
00119     mDocType = docType;
00120 }
00121 
00122 SP_XmlDocTypeNode * SP_XmlDocument :: getDocType() const
00123 {
00124     return mDocType;
00125 }
00126 
00127 void SP_XmlDocument :: setRootElement( SP_XmlElementNode * rootElement )
00128 {
00129     int index = -1;
00130     for( int i = 0; i < mChildren->getLength(); i++ ) {
00131         const SP_XmlNode * node = mChildren->get( i );
00132 
00133         if( SP_XmlNode::eELEMENT == node->getType() ) {
00134             index = i;
00135             break;
00136         }
00137     }
00138 
00139     if( index >= 0 ) {
00140         SP_XmlNode * node = mChildren->take( index );
00141         delete node;
00142     }
00143 
00144     mChildren->append( rootElement );
00145     rootElement->setParent( this );
00146 }
00147 
00148 SP_XmlElementNode * SP_XmlDocument :: getRootElement() const
00149 {
00150     SP_XmlElementNode * ret = NULL;
00151 
00152     for( int i = 0; i < mChildren->getLength(); i++ ) {
00153         const SP_XmlNode * node = mChildren->get( i );
00154 
00155         if( SP_XmlNode::eELEMENT == node->getType() ) {
00156             ret = (SP_XmlElementNode*)node;
00157             break;
00158         }
00159     }
00160 
00161     return ret;
00162 }
00163 
00164 SP_XmlNodeList * SP_XmlDocument :: getChildren() const
00165 {
00166     return mChildren;
00167 }
00168 
00169 //=========================================================
00170 
00171 SP_XmlPINode :: SP_XmlPINode()
00172     : SP_XmlNode( ePI )
00173 {
00174     mEvent = new SP_XmlPIEvent();
00175 }
00176 
00177 SP_XmlPINode :: SP_XmlPINode( SP_XmlPIEvent * event )
00178     : SP_XmlNode( ePI )
00179 {
00180     mEvent = event;
00181 }
00182 
00183 SP_XmlPINode :: ~SP_XmlPINode()
00184 {
00185     if( NULL != mEvent ) delete mEvent;
00186     mEvent = NULL;
00187 }
00188 
00189 void SP_XmlPINode :: setTarget( const char * target )
00190 {
00191     mEvent->setTarget( target );
00192 }
00193 
00194 const char * SP_XmlPINode :: getTarget()
00195 {
00196     return mEvent->getTarget();
00197 }
00198 
00199 void SP_XmlPINode :: setData( const char * data )
00200 {
00201     mEvent->setData( data, strlen( data ) );
00202 }
00203 
00204 const char * SP_XmlPINode :: getData()
00205 {
00206     return mEvent->getData();
00207 }
00208 
00209 //=========================================================
00210 
00211 SP_XmlDocDeclNode :: SP_XmlDocDeclNode()
00212     : SP_XmlNode( eDOCDECL )
00213 {
00214     mEvent = new SP_XmlDocDeclEvent();
00215 }
00216 
00217 SP_XmlDocDeclNode :: SP_XmlDocDeclNode( SP_XmlDocDeclEvent * event )
00218     : SP_XmlNode( eDOCDECL )
00219 {
00220     mEvent = event;
00221 }
00222 
00223 SP_XmlDocDeclNode :: ~SP_XmlDocDeclNode()
00224 {
00225     if( NULL != mEvent ) delete mEvent;
00226     mEvent = NULL;
00227 }
00228 
00229 void SP_XmlDocDeclNode :: setVersion( const char * version )
00230 {
00231     mEvent->setVersion( version );
00232 }
00233 
00234 const char * SP_XmlDocDeclNode :: getVersion() const
00235 {
00236     return mEvent->getVersion();
00237 }
00238 
00239 void SP_XmlDocDeclNode :: setEncoding( const char * encoding )
00240 {
00241     mEvent->setEncoding( encoding );
00242 }
00243 
00244 const char * SP_XmlDocDeclNode :: getEncoding() const
00245 {
00246     return mEvent->getEncoding();
00247 }
00248 
00249 void SP_XmlDocDeclNode :: setStandalone( int standalone )
00250 {
00251     mEvent->setStandalone( standalone );
00252 }
00253 
00254 int SP_XmlDocDeclNode :: getStandalone() const
00255 {
00256     return mEvent->getStandalone();
00257 }
00258 
00259 //=========================================================
00260 
00261 SP_XmlDocTypeNode :: SP_XmlDocTypeNode()
00262     : SP_XmlNode( eDOCTYPE )
00263 {
00264     mEvent = new SP_XmlDocTypeEvent();
00265 }
00266 
00267 SP_XmlDocTypeNode :: SP_XmlDocTypeNode( SP_XmlDocTypeEvent * event )
00268     : SP_XmlNode( eDOCTYPE )
00269 {
00270     mEvent = event;
00271 }
00272 
00273 SP_XmlDocTypeNode :: ~SP_XmlDocTypeNode()
00274 {
00275     if( NULL != mEvent ) delete mEvent;
00276     mEvent = NULL;
00277 }
00278 
00279 void SP_XmlDocTypeNode :: setName( const char * name )
00280 {
00281     mEvent->setName( name );
00282 }
00283 
00284 const char * SP_XmlDocTypeNode :: getName() const
00285 {
00286     return mEvent->getName();
00287 }
00288 
00289 void SP_XmlDocTypeNode :: setSystemID( const char * systemID )
00290 {
00291     mEvent->setSystemID( systemID );
00292 }
00293 
00294 const char * SP_XmlDocTypeNode :: getSystemID() const
00295 {
00296     return mEvent->getSystemID();
00297 }
00298 
00299 void SP_XmlDocTypeNode :: setPublicID( const char * publicID )
00300 {
00301     mEvent->setPublicID( publicID );
00302 }
00303 
00304 const char * SP_XmlDocTypeNode :: getPublicID() const
00305 {
00306     return mEvent->getPublicID();
00307 }
00308 
00309 void SP_XmlDocTypeNode :: setDTD( const char * dtd )
00310 {
00311     mEvent->setDTD( dtd );
00312 }
00313 
00314 const char * SP_XmlDocTypeNode :: getDTD() const
00315 {
00316     return mEvent->getDTD();
00317 }
00318 
00319 //=========================================================
00320 
00321 SP_XmlElementNode :: SP_XmlElementNode()
00322     : SP_XmlNode( eELEMENT )
00323 {
00324     mEvent = new SP_XmlStartTagEvent();
00325     mChildren = new SP_XmlNodeList();
00326 }
00327 
00328 SP_XmlElementNode :: SP_XmlElementNode( SP_XmlStartTagEvent * event )
00329     : SP_XmlNode( eELEMENT )
00330 {
00331     mEvent = event;
00332     mChildren = new SP_XmlNodeList();
00333 }
00334 
00335 SP_XmlElementNode :: ~SP_XmlElementNode()
00336 {
00337     if( NULL != mEvent ) delete mEvent;
00338     mEvent = NULL;
00339 
00340     if( NULL != mChildren ) delete mChildren;
00341     mChildren = NULL;
00342 }
00343 
00344 void SP_XmlElementNode :: setName( const char * name )
00345 {
00346     mEvent->setName( name );
00347 }
00348 
00349 const char * SP_XmlElementNode :: getName() const
00350 {
00351     return mEvent->getName();
00352 }
00353 
00354 void SP_XmlElementNode :: addChild( SP_XmlNode * node )
00355 {
00356     node->setParent( this );
00357     mChildren->append( node );
00358 }
00359 
00360 const SP_XmlNodeList * SP_XmlElementNode :: getChildren() const
00361 {
00362     return mChildren;
00363 }
00364 
00365 void SP_XmlElementNode :: addAttr( const char * name, const char * value )
00366 {
00367     mEvent->addAttr( name, value );
00368 }
00369 
00370 const char * SP_XmlElementNode :: getAttrValue( const char * name ) const
00371 {
00372     return mEvent->getAttrValue( name );
00373 }
00374 
00375 int SP_XmlElementNode :: getAttrCount() const
00376 {
00377     return mEvent->getAttrCount();
00378 }
00379 
00380 const char * SP_XmlElementNode :: getAttr( int index, const char ** value ) const
00381 {
00382     return mEvent->getAttr( index, value );
00383 }
00384 
00385 void SP_XmlElementNode :: removeAttr( const char * name )
00386 {
00387     mEvent->removeAttr( name );
00388 }
00389 
00390 //=========================================================
00391 
00392 SP_XmlCDataNode :: SP_XmlCDataNode()
00393     : SP_XmlNode( eCDATA )
00394 {
00395     mEvent = new SP_XmlCDataEvent();
00396 }
00397 
00398 SP_XmlCDataNode :: SP_XmlCDataNode( SP_XmlCDataEvent * event )
00399     : SP_XmlNode( eCDATA )
00400 {
00401     mEvent = event;
00402 }
00403 
00404 SP_XmlCDataNode :: ~SP_XmlCDataNode()
00405 {
00406     if( NULL != mEvent ) delete mEvent;
00407     mEvent = NULL;
00408 }
00409 
00410 void SP_XmlCDataNode :: setText( const char * content )
00411 {
00412     mEvent->setText( content, strlen( content ) );
00413 }
00414 
00415 const char * SP_XmlCDataNode :: getText() const
00416 {
00417     return mEvent->getText();
00418 }
00419 
00420 //=========================================================
00421 
00422 SP_XmlCommentNode :: SP_XmlCommentNode()
00423     : SP_XmlNode( eCOMMENT )
00424 {
00425     mEvent = new SP_XmlCommentEvent();
00426 }
00427 
00428 SP_XmlCommentNode :: SP_XmlCommentNode( SP_XmlCommentEvent * event )
00429     : SP_XmlNode( eCOMMENT )
00430 {
00431     mEvent = event;
00432 }
00433 
00434 SP_XmlCommentNode :: ~SP_XmlCommentNode()
00435 {
00436     if( NULL != mEvent ) delete mEvent;
00437     mEvent = NULL;
00438 }
00439 
00440 void SP_XmlCommentNode :: setText( const char * comment )
00441 {
00442     mEvent->setText( comment, strlen( comment ) );
00443 }
00444 
00445 const char * SP_XmlCommentNode :: getText() const
00446 {
00447     return mEvent->getText();
00448 }
00449