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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers spxmlhandle.cpp Source File

spxmlhandle.cpp

00001 /*
00002  * Copyright 2008 Stephen Liu
00003  * LGPL, see http://code.google.com/p/spxml/
00004  * For license terms, see the file COPYING along with this library.
00005  */
00006 
00007 #include <stdio.h>
00008 #include <string.h>
00009 
00010 #include "spxmlhandle.hpp"
00011 #include "spxmlnode.hpp"
00012 
00013 
00014 SP_XmlHandle :: SP_XmlHandle( SP_XmlNode * node )
00015 {
00016     mNode = node;
00017 }
00018 
00019 SP_XmlHandle :: SP_XmlHandle( const SP_XmlHandle & ref )
00020 {
00021     mNode = ref.mNode;
00022 }
00023 
00024 SP_XmlHandle & SP_XmlHandle :: operator=( const SP_XmlHandle & ref )
00025 {
00026     mNode = ref.mNode;
00027     return *this;
00028 }
00029 
00030 SP_XmlHandle :: ~SP_XmlHandle()
00031 {
00032 }
00033 
00034 SP_XmlHandle SP_XmlHandle :: getChild( const char * name, int index ) const
00035 {
00036     SP_XmlNode * ret = NULL;
00037 
00038     if( NULL != mNode ) {
00039         if( SP_XmlNode::eELEMENT == mNode->getType() ) {
00040             SP_XmlElementNode * element = (SP_XmlElementNode*)mNode;
00041             const SP_XmlNodeList * children = element->getChildren();
00042 
00043             int tmpIndex = index;
00044             for( int i = 0; i < children->getLength(); i++ ) {
00045                 if( SP_XmlNode::eELEMENT == children->get(i)->getType() ) {
00046                     SP_XmlElementNode * iter = (SP_XmlElementNode*)children->get(i);
00047                     if( 0 == strcmp( name, iter->getName() ) ) {
00048                         if( 0 == tmpIndex ) {
00049                             ret = iter;
00050                             break;
00051                         }
00052                         tmpIndex--;
00053                     }
00054                 }
00055             }
00056         }
00057     }
00058 
00059     return SP_XmlHandle( ret );
00060 }
00061 
00062 SP_XmlHandle SP_XmlHandle :: getChild( int index ) const
00063 {
00064     SP_XmlNode * ret = NULL;
00065 
00066     if( NULL != mNode ) {
00067         if( SP_XmlNode::eELEMENT == mNode->getType() ) {
00068             SP_XmlElementNode * element = (SP_XmlElementNode*)mNode;
00069             ret = (SP_XmlNode*)element->getChildren()->get( index );
00070         }
00071     }
00072 
00073     return SP_XmlHandle( ret );
00074 }
00075 
00076 SP_XmlHandle SP_XmlHandle :: getElement( int index ) const
00077 {
00078     SP_XmlNode * ret = NULL;
00079 
00080     if( NULL != mNode ) {
00081         if( SP_XmlNode::eELEMENT == mNode->getType() ) {
00082             SP_XmlElementNode * element = (SP_XmlElementNode*)mNode;
00083             const SP_XmlNodeList * children = element->getChildren();
00084 
00085             int tmpIndex = index;
00086             for( int i = 0; i < children->getLength(); i++ ) {
00087                 if( SP_XmlNode::eELEMENT == children->get(i)->getType() ) {
00088                     SP_XmlElementNode * iter = (SP_XmlElementNode*)children->get(i);
00089 
00090                     if( 0 == tmpIndex ) {
00091                         ret = iter;
00092                         break;
00093                     }
00094                     tmpIndex--;
00095                 }
00096             }
00097         }
00098     }
00099 
00100     return SP_XmlHandle( ret );
00101 }
00102 
00103 SP_XmlNode * SP_XmlHandle :: toNode()
00104 {
00105     return mNode;
00106 }
00107 
00108 SP_XmlElementNode * SP_XmlHandle :: toElement()
00109 {
00110     if( NULL != mNode && SP_XmlNode::eELEMENT == mNode->getType() ) {
00111         return (SP_XmlElementNode*)mNode;
00112     }
00113 
00114     return NULL;
00115 }
00116 
00117 SP_XmlCDataNode * SP_XmlHandle :: toCData()
00118 {
00119     if( NULL != mNode && SP_XmlNode::eCDATA == mNode->getType() ) {
00120         return (SP_XmlCDataNode*)mNode;
00121     }
00122 
00123     return NULL;
00124 }
00125