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

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 "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();
}