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
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
Generated on Sun Jul 17 2022 09:10:11 by 1.7.2