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

Revision:
0:3fa97f2c0505
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spxmlevent.cpp	Wed Nov 24 20:52:14 2010 +0000
@@ -0,0 +1,372 @@
+/*
+ * 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()
+{
+}
+