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
spxmlevent.cpp
- Committer:
- hlipka
- Date:
- 2010-11-24
- Revision:
- 0:3fa97f2c0505
File content as of revision 0:3fa97f2c0505:
/* * Copyright 2007 Stephen Liu * LGPL, see http://code.google.com/p/spxml/ * For license terms, see the file COPYING along with this library. */ #include <string.h> #include <stdlib.h> #include "mstring.h" #include "spxmlevent.hpp" #include "spxmlutils.hpp" SP_XmlPullEvent :: SP_XmlPullEvent( int eventType ) : mEventType( eventType ) { } SP_XmlPullEvent :: ~SP_XmlPullEvent() { } int SP_XmlPullEvent :: getEventType() { return mEventType; } //========================================================= SP_XmlPullEventQueue :: SP_XmlPullEventQueue() { mQueue = new SP_XmlQueue(); } SP_XmlPullEventQueue :: ~SP_XmlPullEventQueue() { for( void * item = mQueue->pop(); NULL != item; item = mQueue->pop() ) { delete (SP_XmlPullEvent*)item; } delete mQueue; } void SP_XmlPullEventQueue :: enqueue( SP_XmlPullEvent * event ) { mQueue->push( event ); } SP_XmlPullEvent * SP_XmlPullEventQueue :: dequeue() { SP_XmlPullEvent * event = (SP_XmlPullEvent*)mQueue->pop(); return event; } //========================================================= SP_XmlStartDocEvent :: SP_XmlStartDocEvent() : SP_XmlPullEvent( eStartDocument ) { } SP_XmlStartDocEvent :: ~SP_XmlStartDocEvent() { } //========================================================= SP_XmlEndDocEvent :: SP_XmlEndDocEvent() : SP_XmlPullEvent( eEndDocument ) { } SP_XmlEndDocEvent :: ~SP_XmlEndDocEvent() { } //========================================================= SP_XmlDocTypeEvent :: SP_XmlDocTypeEvent() : SP_XmlPullEvent( eDocType ) { memset( mName, 0, sizeof( mName ) ); memset( mSystemID, 0, sizeof( mSystemID ) ); memset( mPublicID, 0, sizeof( mPublicID ) ); memset( mDTD, 0, sizeof( mDTD ) ); } SP_XmlDocTypeEvent :: ~SP_XmlDocTypeEvent() { } void SP_XmlDocTypeEvent :: setName( const char * name ) { strncpy( mName, name, sizeof( mName ) - 1 ); } const char * SP_XmlDocTypeEvent :: getName() const { return mName; } void SP_XmlDocTypeEvent :: setSystemID( const char * systemID ) { strncpy( mSystemID, systemID, sizeof( mSystemID ) - 1 ); } const char * SP_XmlDocTypeEvent :: getSystemID() const { return mSystemID; } void SP_XmlDocTypeEvent :: setPublicID( const char * publicID ) { strncpy( mPublicID, publicID, sizeof( mPublicID ) - 1 ); } const char * SP_XmlDocTypeEvent :: getPublicID() const { return mPublicID; } void SP_XmlDocTypeEvent :: setDTD( const char * dtd ) { strncpy( mDTD, dtd, sizeof( mDTD ) - 1 ); } const char * SP_XmlDocTypeEvent :: getDTD() const { return mDTD; } //========================================================= SP_XmlPIEvent :: SP_XmlPIEvent() : SP_XmlPullEvent( ePI ) { memset( mTarget, 0, sizeof( mTarget ) ); mData = NULL; } SP_XmlPIEvent :: ~SP_XmlPIEvent() { if( NULL != mData ) free( mData ); mData = NULL; } void SP_XmlPIEvent :: setTarget( const char * target ) { snprintf( mTarget, sizeof( mTarget ), "%s", target ); } const char * SP_XmlPIEvent :: getTarget() { return mTarget; } void SP_XmlPIEvent :: setData( const char * data, int len ) { if( NULL != data ) { if( NULL != mData ) free( mData ); mData = (char*)malloc( len + 1 ); memcpy( mData, data, len ); mData[ len ] = '\0'; } } const char * SP_XmlPIEvent :: getData() { return mData; } //========================================================= SP_XmlDocDeclEvent :: SP_XmlDocDeclEvent() : SP_XmlPullEvent( eDocDecl ) { memset( mVersion, 0, sizeof( mVersion ) ); memset( mEncoding, 0, sizeof( mEncoding ) ); mStandalone = -1; } SP_XmlDocDeclEvent :: ~SP_XmlDocDeclEvent() { } void SP_XmlDocDeclEvent :: setVersion( const char * version ) { strncpy( mVersion, version, sizeof( mVersion ) -1 ); } const char * SP_XmlDocDeclEvent :: getVersion() const { return mVersion; } void SP_XmlDocDeclEvent :: setEncoding( const char * encoding ) { strncpy( mEncoding, encoding, sizeof( mEncoding ) -1 ); } const char * SP_XmlDocDeclEvent :: getEncoding() const { return mEncoding; } void SP_XmlDocDeclEvent :: setStandalone( int standalone ) { mStandalone = standalone; } int SP_XmlDocDeclEvent :: getStandalone() const { return mStandalone; } //========================================================= SP_XmlStartTagEvent :: SP_XmlStartTagEvent() : SP_XmlPullEvent( eStartTag ) { mName = NULL; mAttrNameList = new SP_XmlArrayList(); mAttrValueList = new SP_XmlArrayList(); } SP_XmlStartTagEvent :: ~SP_XmlStartTagEvent() { if( NULL != mName ) free( mName ); mName = NULL; int i = 0; for( i = 0; i < mAttrNameList->getCount(); i++ ) { free( (char*)mAttrNameList->getItem( i ) ); } delete mAttrNameList; mAttrNameList = NULL; for( i = 0; i < mAttrValueList->getCount(); i++ ) { free( (char*)mAttrValueList->getItem( i ) ); } delete mAttrValueList; mAttrValueList = NULL; } void SP_XmlStartTagEvent :: setName( const char * name ) { if( NULL != name ) { if( NULL != mName ) free( mName ); mName = strdup( name ); } } const char * SP_XmlStartTagEvent :: getName() const { return mName; } void SP_XmlStartTagEvent :: addAttr( const char * name, const char * value ) { if( NULL != name ) mAttrNameList->append( strdup( name ) ); if( NULL != value ) mAttrValueList->append( strdup( value ) ); } const char * SP_XmlStartTagEvent :: getAttrValue( const char * name ) const { const char * ret = NULL; for( int i = 0; i < mAttrNameList->getCount(); i++ ) { if( 0 == strcmp( name, (char*)mAttrNameList->getItem( i ) ) ) { ret = (char*)mAttrValueList->getItem( i ); break; } } return ret; } int SP_XmlStartTagEvent :: getAttrCount() const { return mAttrNameList->getCount(); } const char * SP_XmlStartTagEvent :: getAttr( int index, const char ** value ) const { const char * name = (char*)mAttrNameList->getItem( index ); if( NULL != name && NULL != value ) *value = (char*)mAttrValueList->getItem( index ); return name; } void SP_XmlStartTagEvent :: removeAttr( const char * name ) { int index = -1; for( int i = 0; i < mAttrNameList->getCount(); i++ ) { if( 0 == strcmp( name, (char*)mAttrNameList->getItem( i ) ) ) { index = i; break; } } if( index >= 0 ) { free( mAttrNameList->takeItem( index ) ); free( mAttrValueList->takeItem( index ) ); } } //========================================================= SP_XmlTextEvent :: SP_XmlTextEvent( int eventType ) : SP_XmlPullEvent( eventType ) { mText = NULL; } SP_XmlTextEvent :: ~SP_XmlTextEvent() { if( NULL != mText ) free( mText ); mText = NULL; } void SP_XmlTextEvent :: setText( const char * text, int len ) { if( NULL != text ) { if( NULL != mText ) free( mText ); mText = (char*)malloc( len + 1 ); memcpy( mText, text, len ); mText[ len ] = '\0'; } } const char * SP_XmlTextEvent :: getText() const { return mText; } //========================================================= SP_XmlEndTagEvent :: SP_XmlEndTagEvent() : SP_XmlTextEvent( eEndTag ) { } SP_XmlEndTagEvent :: ~SP_XmlEndTagEvent() { } //========================================================= SP_XmlCDataEvent :: SP_XmlCDataEvent() : SP_XmlTextEvent( eCData ) { } SP_XmlCDataEvent :: ~SP_XmlCDataEvent() { } //========================================================= SP_XmlCommentEvent :: SP_XmlCommentEvent() : SP_XmlTextEvent( eComment ) { } SP_XmlCommentEvent :: ~SP_XmlCommentEvent() { }