Download NHK English news podcast automatically. XML Parser "spxml" is used. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/
Dependencies: BlinkLed HTTPClient EthernetInterface FatFileSystemCpp MSCFileSystem spxml mbed-rtos mbed
Fork of mpod_nhk_english by
Download NHK English news podcast automatically.
XML Parser "spxml" is used.
This application requires mpod mother board.
See also http://mbed.org/users/geodenx/notebook/mpod/
Diff: spxml/spdomiterator.cpp
- Revision:
- 4:7dae52cf560f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spxml/spdomiterator.cpp Mon Aug 20 13:27:17 2012 +0000 @@ -0,0 +1,100 @@ +/* + * Copyright 2007 Stephen Liu + * For license terms, see the file COPYING along with this library. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +#include "spdomiterator.hpp" +#include "spxmlnode.hpp" + +SP_DomIterator :: SP_DomIterator( const SP_XmlNode * node ) +{ + mRoot = node; + mCurrent = node; +} + +SP_DomIterator :: ~SP_DomIterator() +{ +} + +const SP_XmlNode * SP_DomIterator :: getNext() +{ + if( NULL == mCurrent ) return NULL; + + const SP_XmlNode * retNode = mCurrent; + + // find first left child + if( SP_XmlNode::eXMLDOC == mCurrent->getType() ) { + SP_XmlDocument * document = static_cast<SP_XmlDocument*>((SP_XmlNode*)mCurrent); + + mCurrent = NULL; + retNode = document->getDocDecl(); + if( NULL == retNode ) retNode = document->getDocType(); + if( NULL == retNode ) { + retNode = document->getRootElement(); + if( NULL != retNode ) mCurrent = document->getRootElement()->getChildren()->get( 0 ); + } + } else if( SP_XmlNode::eELEMENT == mCurrent->getType() ) { + SP_XmlElementNode * element = static_cast<SP_XmlElementNode*>((SP_XmlNode*)mCurrent); + const SP_XmlNodeList * children = element->getChildren(); + mCurrent = children->get( 0 ); + } else { + mCurrent = NULL; + } + + // find next sibling + if( NULL == mCurrent ) { + mCurrent = retNode; + + const SP_XmlNode * parent = NULL; + if( NULL != mCurrent ) parent = mCurrent->getParent(); + + for( ; NULL != parent; ) { + if( SP_XmlNode::eXMLDOC == parent->getType() ) { + SP_XmlDocument * document = static_cast<SP_XmlDocument*>((SP_XmlNode*)parent); + if( mCurrent == document->getDocDecl() ) { + mCurrent = document->getDocType(); + if( NULL == mCurrent ) mCurrent = document->getRootElement(); + } else if( mCurrent == document->getDocType() ) { + mCurrent = document->getRootElement(); + } else { + mCurrent = NULL; + } + } else if( SP_XmlNode::eELEMENT == parent->getType() ) { + SP_XmlElementNode * element = static_cast<SP_XmlElementNode*>((SP_XmlNode*)parent); + const SP_XmlNodeList * children = element->getChildren(); + + int index = -1; + for( int i = 0; i < children->getLength(); i++ ) { + if( mCurrent == children->get( i ) ) { + index = i; + break; + } + } + + if( index >= 0 && index < ( children->getLength() - 1 ) ) { + mCurrent = children->get( index + 1 ); + } else { + mCurrent = NULL; + } + } else { + mCurrent = NULL; + assert( 0 ); // should not occur + } + + if( NULL == mCurrent ) { + mCurrent = parent; + parent = mCurrent->getParent(); + if( NULL == parent ) mCurrent = NULL; + if( mRoot == mCurrent ) mCurrent = NULL; + } else { + break; + } + } + } + + return retNode; +}