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/spdomiterator.cpp	Wed Nov 24 20:52:14 2010 +0000
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2007 Stephen Liu
+ * LGPL, see http://code.google.com/p/spxml/
+ * 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;
+}
+