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
Diff: spxmlnode.cpp
- Revision:
- 0:3fa97f2c0505
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spxmlnode.cpp Wed Nov 24 20:52:14 2010 +0000 @@ -0,0 +1,449 @@ +/* + * 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 "spxmlnode.hpp" +#include "spxmlutils.hpp" +#include "spxmlevent.hpp" + +//========================================================= + +SP_XmlNode :: SP_XmlNode( int type ) + : mType( type ) +{ + mParent = NULL; +} + +SP_XmlNode :: ~SP_XmlNode() +{ + mParent = NULL; +} + +void SP_XmlNode :: setParent( SP_XmlNode * parent ) +{ + mParent = parent; +} + +const SP_XmlNode * SP_XmlNode :: getParent() const +{ + return mParent; +} + +int SP_XmlNode :: getType() const +{ + return mType; +} + +//========================================================= + +SP_XmlNodeList :: SP_XmlNodeList() +{ + mList = new SP_XmlArrayList(); +} + +SP_XmlNodeList :: ~SP_XmlNodeList() +{ + for( int i = 0; i < mList->getCount(); i++ ) { + SP_XmlNode * node = (SP_XmlNode*)mList->getItem( i ); + delete node; + } + + delete mList; + + mList = NULL; +} + +int SP_XmlNodeList :: getLength() const +{ + return mList->getCount(); +} + +void SP_XmlNodeList :: append( SP_XmlNode * node ) +{ + mList->append( node ); +} + +SP_XmlNode * SP_XmlNodeList :: get( int index ) const +{ + return (SP_XmlNode*)mList->getItem( index ); +} + +SP_XmlNode * SP_XmlNodeList :: take( int index ) const +{ + return (SP_XmlNode*)mList->takeItem( index ); +} + +//========================================================= + +SP_XmlDocument :: SP_XmlDocument() + : SP_XmlNode( eXMLDOC ) +{ + mDocDecl = NULL; + mDocType = NULL; + mChildren = new SP_XmlNodeList(); +} + +SP_XmlDocument :: ~SP_XmlDocument() +{ + if( NULL != mDocDecl ) delete mDocDecl; + mDocDecl = NULL; + + if( NULL != mDocType ) delete mDocType; + mDocType = NULL; + + if( NULL != mChildren ) delete mChildren; + mChildren = NULL; +} + +void SP_XmlDocument :: setDocDecl( SP_XmlDocDeclNode * docDecl ) +{ + if( NULL != mDocDecl ) delete mDocDecl; + docDecl->setParent( this ); + mDocDecl = docDecl; +} + +SP_XmlDocDeclNode * SP_XmlDocument :: getDocDecl() const +{ + return mDocDecl; +} + +void SP_XmlDocument :: setDocType( SP_XmlDocTypeNode * docType ) +{ + if( NULL != mDocType ) delete mDocType; + docType->setParent( this ); + mDocType = docType; +} + +SP_XmlDocTypeNode * SP_XmlDocument :: getDocType() const +{ + return mDocType; +} + +void SP_XmlDocument :: setRootElement( SP_XmlElementNode * rootElement ) +{ + int index = -1; + for( int i = 0; i < mChildren->getLength(); i++ ) { + const SP_XmlNode * node = mChildren->get( i ); + + if( SP_XmlNode::eELEMENT == node->getType() ) { + index = i; + break; + } + } + + if( index >= 0 ) { + SP_XmlNode * node = mChildren->take( index ); + delete node; + } + + mChildren->append( rootElement ); + rootElement->setParent( this ); +} + +SP_XmlElementNode * SP_XmlDocument :: getRootElement() const +{ + SP_XmlElementNode * ret = NULL; + + for( int i = 0; i < mChildren->getLength(); i++ ) { + const SP_XmlNode * node = mChildren->get( i ); + + if( SP_XmlNode::eELEMENT == node->getType() ) { + ret = (SP_XmlElementNode*)node; + break; + } + } + + return ret; +} + +SP_XmlNodeList * SP_XmlDocument :: getChildren() const +{ + return mChildren; +} + +//========================================================= + +SP_XmlPINode :: SP_XmlPINode() + : SP_XmlNode( ePI ) +{ + mEvent = new SP_XmlPIEvent(); +} + +SP_XmlPINode :: SP_XmlPINode( SP_XmlPIEvent * event ) + : SP_XmlNode( ePI ) +{ + mEvent = event; +} + +SP_XmlPINode :: ~SP_XmlPINode() +{ + if( NULL != mEvent ) delete mEvent; + mEvent = NULL; +} + +void SP_XmlPINode :: setTarget( const char * target ) +{ + mEvent->setTarget( target ); +} + +const char * SP_XmlPINode :: getTarget() +{ + return mEvent->getTarget(); +} + +void SP_XmlPINode :: setData( const char * data ) +{ + mEvent->setData( data, strlen( data ) ); +} + +const char * SP_XmlPINode :: getData() +{ + return mEvent->getData(); +} + +//========================================================= + +SP_XmlDocDeclNode :: SP_XmlDocDeclNode() + : SP_XmlNode( eDOCDECL ) +{ + mEvent = new SP_XmlDocDeclEvent(); +} + +SP_XmlDocDeclNode :: SP_XmlDocDeclNode( SP_XmlDocDeclEvent * event ) + : SP_XmlNode( eDOCDECL ) +{ + mEvent = event; +} + +SP_XmlDocDeclNode :: ~SP_XmlDocDeclNode() +{ + if( NULL != mEvent ) delete mEvent; + mEvent = NULL; +} + +void SP_XmlDocDeclNode :: setVersion( const char * version ) +{ + mEvent->setVersion( version ); +} + +const char * SP_XmlDocDeclNode :: getVersion() const +{ + return mEvent->getVersion(); +} + +void SP_XmlDocDeclNode :: setEncoding( const char * encoding ) +{ + mEvent->setEncoding( encoding ); +} + +const char * SP_XmlDocDeclNode :: getEncoding() const +{ + return mEvent->getEncoding(); +} + +void SP_XmlDocDeclNode :: setStandalone( int standalone ) +{ + mEvent->setStandalone( standalone ); +} + +int SP_XmlDocDeclNode :: getStandalone() const +{ + return mEvent->getStandalone(); +} + +//========================================================= + +SP_XmlDocTypeNode :: SP_XmlDocTypeNode() + : SP_XmlNode( eDOCTYPE ) +{ + mEvent = new SP_XmlDocTypeEvent(); +} + +SP_XmlDocTypeNode :: SP_XmlDocTypeNode( SP_XmlDocTypeEvent * event ) + : SP_XmlNode( eDOCTYPE ) +{ + mEvent = event; +} + +SP_XmlDocTypeNode :: ~SP_XmlDocTypeNode() +{ + if( NULL != mEvent ) delete mEvent; + mEvent = NULL; +} + +void SP_XmlDocTypeNode :: setName( const char * name ) +{ + mEvent->setName( name ); +} + +const char * SP_XmlDocTypeNode :: getName() const +{ + return mEvent->getName(); +} + +void SP_XmlDocTypeNode :: setSystemID( const char * systemID ) +{ + mEvent->setSystemID( systemID ); +} + +const char * SP_XmlDocTypeNode :: getSystemID() const +{ + return mEvent->getSystemID(); +} + +void SP_XmlDocTypeNode :: setPublicID( const char * publicID ) +{ + mEvent->setPublicID( publicID ); +} + +const char * SP_XmlDocTypeNode :: getPublicID() const +{ + return mEvent->getPublicID(); +} + +void SP_XmlDocTypeNode :: setDTD( const char * dtd ) +{ + mEvent->setDTD( dtd ); +} + +const char * SP_XmlDocTypeNode :: getDTD() const +{ + return mEvent->getDTD(); +} + +//========================================================= + +SP_XmlElementNode :: SP_XmlElementNode() + : SP_XmlNode( eELEMENT ) +{ + mEvent = new SP_XmlStartTagEvent(); + mChildren = new SP_XmlNodeList(); +} + +SP_XmlElementNode :: SP_XmlElementNode( SP_XmlStartTagEvent * event ) + : SP_XmlNode( eELEMENT ) +{ + mEvent = event; + mChildren = new SP_XmlNodeList(); +} + +SP_XmlElementNode :: ~SP_XmlElementNode() +{ + if( NULL != mEvent ) delete mEvent; + mEvent = NULL; + + if( NULL != mChildren ) delete mChildren; + mChildren = NULL; +} + +void SP_XmlElementNode :: setName( const char * name ) +{ + mEvent->setName( name ); +} + +const char * SP_XmlElementNode :: getName() const +{ + return mEvent->getName(); +} + +void SP_XmlElementNode :: addChild( SP_XmlNode * node ) +{ + node->setParent( this ); + mChildren->append( node ); +} + +const SP_XmlNodeList * SP_XmlElementNode :: getChildren() const +{ + return mChildren; +} + +void SP_XmlElementNode :: addAttr( const char * name, const char * value ) +{ + mEvent->addAttr( name, value ); +} + +const char * SP_XmlElementNode :: getAttrValue( const char * name ) const +{ + return mEvent->getAttrValue( name ); +} + +int SP_XmlElementNode :: getAttrCount() const +{ + return mEvent->getAttrCount(); +} + +const char * SP_XmlElementNode :: getAttr( int index, const char ** value ) const +{ + return mEvent->getAttr( index, value ); +} + +void SP_XmlElementNode :: removeAttr( const char * name ) +{ + mEvent->removeAttr( name ); +} + +//========================================================= + +SP_XmlCDataNode :: SP_XmlCDataNode() + : SP_XmlNode( eCDATA ) +{ + mEvent = new SP_XmlCDataEvent(); +} + +SP_XmlCDataNode :: SP_XmlCDataNode( SP_XmlCDataEvent * event ) + : SP_XmlNode( eCDATA ) +{ + mEvent = event; +} + +SP_XmlCDataNode :: ~SP_XmlCDataNode() +{ + if( NULL != mEvent ) delete mEvent; + mEvent = NULL; +} + +void SP_XmlCDataNode :: setText( const char * content ) +{ + mEvent->setText( content, strlen( content ) ); +} + +const char * SP_XmlCDataNode :: getText() const +{ + return mEvent->getText(); +} + +//========================================================= + +SP_XmlCommentNode :: SP_XmlCommentNode() + : SP_XmlNode( eCOMMENT ) +{ + mEvent = new SP_XmlCommentEvent(); +} + +SP_XmlCommentNode :: SP_XmlCommentNode( SP_XmlCommentEvent * event ) + : SP_XmlNode( eCOMMENT ) +{ + mEvent = event; +} + +SP_XmlCommentNode :: ~SP_XmlCommentNode() +{ + if( NULL != mEvent ) delete mEvent; + mEvent = NULL; +} + +void SP_XmlCommentNode :: setText( const char * comment ) +{ + mEvent->setText( comment, strlen( comment ) ); +} + +const char * SP_XmlCommentNode :: getText() const +{ + return mEvent->getText(); +} +