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 Satoshi Togawa

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/

Committer:
togayan
Date:
Mon Aug 20 13:27:17 2012 +0000
Revision:
4:7dae52cf560f
1st revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
togayan 4:7dae52cf560f 1 /*
togayan 4:7dae52cf560f 2 * Copyright 2007 Stephen Liu
togayan 4:7dae52cf560f 3 * For license terms, see the file COPYING along with this library.
togayan 4:7dae52cf560f 4 */
togayan 4:7dae52cf560f 5
togayan 4:7dae52cf560f 6 #include <assert.h>
togayan 4:7dae52cf560f 7
togayan 4:7dae52cf560f 8 #include "spdomparser.hpp"
togayan 4:7dae52cf560f 9 #include "spxmlparser.hpp"
togayan 4:7dae52cf560f 10 #include "spxmlevent.hpp"
togayan 4:7dae52cf560f 11 #include "spxmlutils.hpp"
togayan 4:7dae52cf560f 12 #include "spxmlnode.hpp"
togayan 4:7dae52cf560f 13 #include "spxmlcodec.hpp"
togayan 4:7dae52cf560f 14
togayan 4:7dae52cf560f 15 //=========================================================
togayan 4:7dae52cf560f 16
togayan 4:7dae52cf560f 17 SP_XmlDomParser :: SP_XmlDomParser()
togayan 4:7dae52cf560f 18 {
togayan 4:7dae52cf560f 19 mParser = new SP_XmlPullParser();
togayan 4:7dae52cf560f 20 mDocument = new SP_XmlDocument();
togayan 4:7dae52cf560f 21 mCurrent = NULL;
togayan 4:7dae52cf560f 22 }
togayan 4:7dae52cf560f 23
togayan 4:7dae52cf560f 24 SP_XmlDomParser :: ~SP_XmlDomParser()
togayan 4:7dae52cf560f 25 {
togayan 4:7dae52cf560f 26 if( NULL != mDocument ) delete mDocument;
togayan 4:7dae52cf560f 27 mDocument = NULL;
togayan 4:7dae52cf560f 28
togayan 4:7dae52cf560f 29 if( NULL != mParser ) delete mParser;
togayan 4:7dae52cf560f 30 mParser = NULL;
togayan 4:7dae52cf560f 31 }
togayan 4:7dae52cf560f 32
togayan 4:7dae52cf560f 33 void SP_XmlDomParser :: setIgnoreWhitespace( int ignoreWhitespace )
togayan 4:7dae52cf560f 34 {
togayan 4:7dae52cf560f 35 mParser->setIgnoreWhitespace( ignoreWhitespace );
togayan 4:7dae52cf560f 36 }
togayan 4:7dae52cf560f 37
togayan 4:7dae52cf560f 38 int SP_XmlDomParser :: getIgnoreWhitespace()
togayan 4:7dae52cf560f 39 {
togayan 4:7dae52cf560f 40 return mParser->getIgnoreWhitespace();
togayan 4:7dae52cf560f 41 }
togayan 4:7dae52cf560f 42
togayan 4:7dae52cf560f 43 const char * SP_XmlDomParser :: getEncoding()
togayan 4:7dae52cf560f 44 {
togayan 4:7dae52cf560f 45 return mParser->getEncoding();
togayan 4:7dae52cf560f 46 }
togayan 4:7dae52cf560f 47
togayan 4:7dae52cf560f 48 int SP_XmlDomParser :: append( const char * source, int len )
togayan 4:7dae52cf560f 49 {
togayan 4:7dae52cf560f 50 int ret = 0;
togayan 4:7dae52cf560f 51
togayan 4:7dae52cf560f 52 for( int pos = 0; pos < len; pos += 64 ) {
togayan 4:7dae52cf560f 53 int realLen = ( len - pos ) > 64 ? 64 : ( len - pos );
togayan 4:7dae52cf560f 54 ret += mParser->append( source + pos, realLen );
togayan 4:7dae52cf560f 55 buildTree();
togayan 4:7dae52cf560f 56 }
togayan 4:7dae52cf560f 57
togayan 4:7dae52cf560f 58 return ret;
togayan 4:7dae52cf560f 59 }
togayan 4:7dae52cf560f 60
togayan 4:7dae52cf560f 61 void SP_XmlDomParser :: buildTree()
togayan 4:7dae52cf560f 62 {
togayan 4:7dae52cf560f 63 for( SP_XmlPullEvent * event = mParser->getNext();
togayan 4:7dae52cf560f 64 NULL != event; event = mParser->getNext() ) {
togayan 4:7dae52cf560f 65
togayan 4:7dae52cf560f 66 switch( event->getEventType() ) {
togayan 4:7dae52cf560f 67 case SP_XmlPullEvent::eStartDocument:
togayan 4:7dae52cf560f 68 // ignore
togayan 4:7dae52cf560f 69 delete event;
togayan 4:7dae52cf560f 70 break;
togayan 4:7dae52cf560f 71 case SP_XmlPullEvent::eEndDocument:
togayan 4:7dae52cf560f 72 // ignore
togayan 4:7dae52cf560f 73 delete event;
togayan 4:7dae52cf560f 74 break;
togayan 4:7dae52cf560f 75 case SP_XmlPullEvent::eDocDecl:
togayan 4:7dae52cf560f 76 {
togayan 4:7dae52cf560f 77 mDocument->setDocDecl(
togayan 4:7dae52cf560f 78 new SP_XmlDocDeclNode( (SP_XmlDocDeclEvent*)event ) );
togayan 4:7dae52cf560f 79 break;
togayan 4:7dae52cf560f 80 }
togayan 4:7dae52cf560f 81 case SP_XmlPullEvent::eDocType:
togayan 4:7dae52cf560f 82 {
togayan 4:7dae52cf560f 83 mDocument->setDocType(
togayan 4:7dae52cf560f 84 new SP_XmlDocTypeNode( (SP_XmlDocTypeEvent*)event ) );
togayan 4:7dae52cf560f 85 break;
togayan 4:7dae52cf560f 86 }
togayan 4:7dae52cf560f 87 case SP_XmlPullEvent::eStartTag:
togayan 4:7dae52cf560f 88 {
togayan 4:7dae52cf560f 89 SP_XmlElementNode * element =
togayan 4:7dae52cf560f 90 new SP_XmlElementNode( (SP_XmlStartTagEvent*)event );
togayan 4:7dae52cf560f 91 if( NULL == mCurrent ) {
togayan 4:7dae52cf560f 92 mCurrent = element;
togayan 4:7dae52cf560f 93 mDocument->setRootElement( element );
togayan 4:7dae52cf560f 94 } else {
togayan 4:7dae52cf560f 95 mCurrent->addChild( element );
togayan 4:7dae52cf560f 96 mCurrent = element;
togayan 4:7dae52cf560f 97 }
togayan 4:7dae52cf560f 98 break;
togayan 4:7dae52cf560f 99 }
togayan 4:7dae52cf560f 100 case SP_XmlPullEvent::eEndTag:
togayan 4:7dae52cf560f 101 {
togayan 4:7dae52cf560f 102 SP_XmlNode * parent = (SP_XmlNode*)mCurrent->getParent();
togayan 4:7dae52cf560f 103 if( NULL != parent && SP_XmlNode::eELEMENT == parent->getType() ) {
togayan 4:7dae52cf560f 104 mCurrent = static_cast<SP_XmlElementNode*>((SP_XmlNode*)parent);
togayan 4:7dae52cf560f 105 } else {
togayan 4:7dae52cf560f 106 mCurrent = NULL;
togayan 4:7dae52cf560f 107 }
togayan 4:7dae52cf560f 108
togayan 4:7dae52cf560f 109 delete event;
togayan 4:7dae52cf560f 110 break;
togayan 4:7dae52cf560f 111 }
togayan 4:7dae52cf560f 112 case SP_XmlPullEvent::eCData:
togayan 4:7dae52cf560f 113 {
togayan 4:7dae52cf560f 114 if( NULL != mCurrent ) {
togayan 4:7dae52cf560f 115 mCurrent->addChild( new SP_XmlCDataNode( (SP_XmlCDataEvent*)event ) );
togayan 4:7dae52cf560f 116 } else {
togayan 4:7dae52cf560f 117 delete event;
togayan 4:7dae52cf560f 118 }
togayan 4:7dae52cf560f 119 break;
togayan 4:7dae52cf560f 120 }
togayan 4:7dae52cf560f 121 case SP_XmlPullEvent::eComment:
togayan 4:7dae52cf560f 122 {
togayan 4:7dae52cf560f 123 if( NULL != mCurrent ) {
togayan 4:7dae52cf560f 124 mCurrent->addChild( new SP_XmlCommentNode( (SP_XmlCommentEvent*)event ) );
togayan 4:7dae52cf560f 125 } else {
togayan 4:7dae52cf560f 126 delete event;
togayan 4:7dae52cf560f 127 }
togayan 4:7dae52cf560f 128 break;
togayan 4:7dae52cf560f 129 }
togayan 4:7dae52cf560f 130 case SP_XmlPIEvent::ePI:
togayan 4:7dae52cf560f 131 {
togayan 4:7dae52cf560f 132 if( NULL != mCurrent ) {
togayan 4:7dae52cf560f 133 mCurrent->addChild( new SP_XmlPINode( (SP_XmlPIEvent*)event ) );
togayan 4:7dae52cf560f 134 } else {
togayan 4:7dae52cf560f 135 mDocument->getChildren()->append(
togayan 4:7dae52cf560f 136 new SP_XmlPINode( (SP_XmlPIEvent*)event ) );
togayan 4:7dae52cf560f 137 }
togayan 4:7dae52cf560f 138 break;
togayan 4:7dae52cf560f 139 }
togayan 4:7dae52cf560f 140 default:
togayan 4:7dae52cf560f 141 {
togayan 4:7dae52cf560f 142 assert( 0 );
togayan 4:7dae52cf560f 143 break;
togayan 4:7dae52cf560f 144 }
togayan 4:7dae52cf560f 145 }
togayan 4:7dae52cf560f 146 }
togayan 4:7dae52cf560f 147 }
togayan 4:7dae52cf560f 148
togayan 4:7dae52cf560f 149 const char * SP_XmlDomParser :: getError()
togayan 4:7dae52cf560f 150 {
togayan 4:7dae52cf560f 151 return mParser->getError();
togayan 4:7dae52cf560f 152 }
togayan 4:7dae52cf560f 153
togayan 4:7dae52cf560f 154 const SP_XmlDocument * SP_XmlDomParser :: getDocument() const
togayan 4:7dae52cf560f 155 {
togayan 4:7dae52cf560f 156 return mDocument;
togayan 4:7dae52cf560f 157 }
togayan 4:7dae52cf560f 158
togayan 4:7dae52cf560f 159 //=========================================================
togayan 4:7dae52cf560f 160
togayan 4:7dae52cf560f 161 SP_XmlDomBuffer :: SP_XmlDomBuffer( const SP_XmlNode * node, int indent )
togayan 4:7dae52cf560f 162 {
togayan 4:7dae52cf560f 163 mBuffer = new SP_XmlStringBuffer();
togayan 4:7dae52cf560f 164 dump( SP_XmlStringCodec::DEFAULT_ENCODING, node, mBuffer, indent ? 0 : -1 );
togayan 4:7dae52cf560f 165 }
togayan 4:7dae52cf560f 166
togayan 4:7dae52cf560f 167 SP_XmlDomBuffer :: SP_XmlDomBuffer( const char * encoding, const SP_XmlNode * node, int indent )
togayan 4:7dae52cf560f 168 {
togayan 4:7dae52cf560f 169 mBuffer = new SP_XmlStringBuffer();
togayan 4:7dae52cf560f 170 dump( encoding, node, mBuffer, indent ? 0 : -1 );
togayan 4:7dae52cf560f 171 }
togayan 4:7dae52cf560f 172
togayan 4:7dae52cf560f 173 SP_XmlDomBuffer :: ~SP_XmlDomBuffer()
togayan 4:7dae52cf560f 174 {
togayan 4:7dae52cf560f 175 if( NULL != mBuffer ) delete mBuffer;
togayan 4:7dae52cf560f 176 mBuffer = NULL;
togayan 4:7dae52cf560f 177 }
togayan 4:7dae52cf560f 178
togayan 4:7dae52cf560f 179 const char * SP_XmlDomBuffer :: getBuffer() const
togayan 4:7dae52cf560f 180 {
togayan 4:7dae52cf560f 181 return mBuffer->getBuffer();
togayan 4:7dae52cf560f 182 }
togayan 4:7dae52cf560f 183
togayan 4:7dae52cf560f 184 int SP_XmlDomBuffer :: getSize() const
togayan 4:7dae52cf560f 185 {
togayan 4:7dae52cf560f 186 return mBuffer->getSize();
togayan 4:7dae52cf560f 187 }
togayan 4:7dae52cf560f 188
togayan 4:7dae52cf560f 189 void SP_XmlDomBuffer :: dump( const char * encoding,
togayan 4:7dae52cf560f 190 const SP_XmlNode * node, SP_XmlStringBuffer * buffer, int level )
togayan 4:7dae52cf560f 191 {
togayan 4:7dae52cf560f 192 if( SP_XmlNode::eXMLDOC == node->getType() ) {
togayan 4:7dae52cf560f 193 SP_XmlDocument * document = static_cast<SP_XmlDocument*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 194 dumpDocDecl( encoding, document->getDocDecl(), buffer, level );
togayan 4:7dae52cf560f 195 dumpDocType( encoding, document->getDocType(), buffer, level );
togayan 4:7dae52cf560f 196
togayan 4:7dae52cf560f 197 const SP_XmlNodeList * children = document->getChildren();
togayan 4:7dae52cf560f 198 for( int j = 0; j < children->getLength(); j++ ) {
togayan 4:7dae52cf560f 199 dump( encoding, children->get( j ), buffer, level );
togayan 4:7dae52cf560f 200 }
togayan 4:7dae52cf560f 201 } else if( SP_XmlNode::eCDATA == node->getType() ) {
togayan 4:7dae52cf560f 202 SP_XmlCDataNode * cdata = static_cast<SP_XmlCDataNode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 203 SP_XmlStringCodec::encode( encoding, cdata->getText(), buffer );
togayan 4:7dae52cf560f 204 } else if( SP_XmlNode::eCOMMENT == node->getType() ) {
togayan 4:7dae52cf560f 205 SP_XmlCommentNode * comment = static_cast<SP_XmlCommentNode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 206
togayan 4:7dae52cf560f 207 if( level >= 0 ) {
togayan 4:7dae52cf560f 208 buffer->append( '\n' );
togayan 4:7dae52cf560f 209 for( int i = 0; i < level; i++ ) buffer->append( '\t' );
togayan 4:7dae52cf560f 210 buffer->append( "<!--" );
togayan 4:7dae52cf560f 211 buffer->append( comment->getText() );
togayan 4:7dae52cf560f 212 buffer->append( "-->\n" );
togayan 4:7dae52cf560f 213 } else {
togayan 4:7dae52cf560f 214 buffer->append( "<!--" );
togayan 4:7dae52cf560f 215 buffer->append( comment->getText() );
togayan 4:7dae52cf560f 216 buffer->append( "-->" );
togayan 4:7dae52cf560f 217 }
togayan 4:7dae52cf560f 218 } else if( SP_XmlNode::eELEMENT == node->getType() ) {
togayan 4:7dae52cf560f 219 dumpElement( encoding, node, buffer, level );
togayan 4:7dae52cf560f 220 } else if( SP_XmlNode::eDOCDECL == node->getType() ) {
togayan 4:7dae52cf560f 221 dumpDocDecl( encoding, (SP_XmlDocDeclNode*)node, buffer, level );
togayan 4:7dae52cf560f 222 } else if( SP_XmlNode::eDOCTYPE == node->getType() ) {
togayan 4:7dae52cf560f 223 dumpDocType( encoding, (SP_XmlDocTypeNode*)node, buffer, level );
togayan 4:7dae52cf560f 224 } else if( SP_XmlNode::ePI == node->getType() ) {
togayan 4:7dae52cf560f 225 SP_XmlPINode * piNode = static_cast<SP_XmlPINode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 226
togayan 4:7dae52cf560f 227 if( level >= 0 ) {
togayan 4:7dae52cf560f 228 for( int i = 0; i < level; i++ ) buffer->append( '\t' );
togayan 4:7dae52cf560f 229 buffer->append( "<?" );
togayan 4:7dae52cf560f 230 buffer->append( piNode->getTarget() );
togayan 4:7dae52cf560f 231 buffer->append( ' ' );
togayan 4:7dae52cf560f 232 buffer->append( piNode->getData() );
togayan 4:7dae52cf560f 233 buffer->append( "?>\n" );
togayan 4:7dae52cf560f 234 } else {
togayan 4:7dae52cf560f 235 buffer->append( "<?" );
togayan 4:7dae52cf560f 236 buffer->append( piNode->getTarget() );
togayan 4:7dae52cf560f 237 if( '\0' != *( piNode->getTarget() ) ) buffer->append( ' ' );
togayan 4:7dae52cf560f 238 buffer->append( piNode->getData() );
togayan 4:7dae52cf560f 239 buffer->append( "?>" );
togayan 4:7dae52cf560f 240 }
togayan 4:7dae52cf560f 241 } else {
togayan 4:7dae52cf560f 242 // ignore
togayan 4:7dae52cf560f 243 }
togayan 4:7dae52cf560f 244 }
togayan 4:7dae52cf560f 245
togayan 4:7dae52cf560f 246 void SP_XmlDomBuffer :: dumpDocDecl( const char * encoding,
togayan 4:7dae52cf560f 247 const SP_XmlDocDeclNode * docDecl,
togayan 4:7dae52cf560f 248 SP_XmlStringBuffer * buffer, int level )
togayan 4:7dae52cf560f 249 {
togayan 4:7dae52cf560f 250 if( NULL == docDecl ) return;
togayan 4:7dae52cf560f 251
togayan 4:7dae52cf560f 252 buffer->append( "<?xml version=\"" );
togayan 4:7dae52cf560f 253 if( '\0' != * ( docDecl->getVersion() ) ) {
togayan 4:7dae52cf560f 254 buffer->append( docDecl->getVersion() );
togayan 4:7dae52cf560f 255 } else {
togayan 4:7dae52cf560f 256 buffer->append( "1.0" );
togayan 4:7dae52cf560f 257 }
togayan 4:7dae52cf560f 258 buffer->append( "\" " );
togayan 4:7dae52cf560f 259
togayan 4:7dae52cf560f 260 if( '\0' != * ( docDecl->getEncoding() ) ) {
togayan 4:7dae52cf560f 261 buffer->append( "encoding=\"" );
togayan 4:7dae52cf560f 262 buffer->append( docDecl->getEncoding() );
togayan 4:7dae52cf560f 263 buffer->append( "\" " );
togayan 4:7dae52cf560f 264 }
togayan 4:7dae52cf560f 265
togayan 4:7dae52cf560f 266 if( -1 != docDecl->getStandalone() ) {
togayan 4:7dae52cf560f 267 char standalone[ 32 ];
togayan 4:7dae52cf560f 268 snprintf( standalone, sizeof( standalone ), "standalone=\"%s\" ",
togayan 4:7dae52cf560f 269 0 == docDecl->getStandalone() ? "no" : "yes" );
togayan 4:7dae52cf560f 270 buffer->append( standalone );
togayan 4:7dae52cf560f 271 }
togayan 4:7dae52cf560f 272
togayan 4:7dae52cf560f 273 buffer->append( level >= 0 ? "?>\n" : "?>" );
togayan 4:7dae52cf560f 274 }
togayan 4:7dae52cf560f 275
togayan 4:7dae52cf560f 276 void SP_XmlDomBuffer :: dumpDocType( const char * encoding,
togayan 4:7dae52cf560f 277 const SP_XmlDocTypeNode * docType,
togayan 4:7dae52cf560f 278 SP_XmlStringBuffer * buffer, int level )
togayan 4:7dae52cf560f 279 {
togayan 4:7dae52cf560f 280 if( NULL == docType ) return;
togayan 4:7dae52cf560f 281
togayan 4:7dae52cf560f 282 buffer->append( "<!DOCTYPE " );
togayan 4:7dae52cf560f 283 buffer->append( docType->getName() );
togayan 4:7dae52cf560f 284
togayan 4:7dae52cf560f 285 if( '\0' != * ( docType->getPublicID() ) ) {
togayan 4:7dae52cf560f 286 buffer->append( " PUBLIC " );
togayan 4:7dae52cf560f 287 buffer->append( '"' );
togayan 4:7dae52cf560f 288 buffer->append( docType->getPublicID() );
togayan 4:7dae52cf560f 289 buffer->append( '"' );
togayan 4:7dae52cf560f 290 }
togayan 4:7dae52cf560f 291
togayan 4:7dae52cf560f 292 if( '\0' != * ( docType->getSystemID() ) ) {
togayan 4:7dae52cf560f 293 buffer->append( " SYSTEM " );
togayan 4:7dae52cf560f 294 buffer->append( '"' );
togayan 4:7dae52cf560f 295 buffer->append( docType->getSystemID() );
togayan 4:7dae52cf560f 296 buffer->append( '"' );
togayan 4:7dae52cf560f 297 }
togayan 4:7dae52cf560f 298
togayan 4:7dae52cf560f 299 if( '\0' != * ( docType->getDTD() ) ) {
togayan 4:7dae52cf560f 300 buffer->append( " \"" );
togayan 4:7dae52cf560f 301 buffer->append( docType->getDTD() );
togayan 4:7dae52cf560f 302 buffer->append( '"' );
togayan 4:7dae52cf560f 303 }
togayan 4:7dae52cf560f 304
togayan 4:7dae52cf560f 305 buffer->append( level >= 0 ? ">\n" : ">" );
togayan 4:7dae52cf560f 306 }
togayan 4:7dae52cf560f 307
togayan 4:7dae52cf560f 308 void SP_XmlDomBuffer :: dumpElement( const char * encoding,
togayan 4:7dae52cf560f 309 const SP_XmlNode * node, SP_XmlStringBuffer * buffer, int level )
togayan 4:7dae52cf560f 310 {
togayan 4:7dae52cf560f 311 if( NULL == node ) return;
togayan 4:7dae52cf560f 312
togayan 4:7dae52cf560f 313 if( SP_XmlNode::eELEMENT == node->getType() ) {
togayan 4:7dae52cf560f 314 int i = 0;
togayan 4:7dae52cf560f 315
togayan 4:7dae52cf560f 316 for( i = 0; i < level; i++ ) buffer->append( '\t' );
togayan 4:7dae52cf560f 317
togayan 4:7dae52cf560f 318 SP_XmlElementNode * element = static_cast<SP_XmlElementNode*>((SP_XmlNode*)node);
togayan 4:7dae52cf560f 319 buffer->append( "<" );
togayan 4:7dae52cf560f 320 buffer->append( element->getName() );
togayan 4:7dae52cf560f 321
togayan 4:7dae52cf560f 322 const char * name = NULL, * value = NULL;
togayan 4:7dae52cf560f 323 for( i = 0; i < element->getAttrCount(); i++ ) {
togayan 4:7dae52cf560f 324 name = element->getAttr( i, &value );
togayan 4:7dae52cf560f 325 if( NULL != name && NULL != value ) {
togayan 4:7dae52cf560f 326 buffer->append( ' ' );
togayan 4:7dae52cf560f 327 buffer->append( name );
togayan 4:7dae52cf560f 328 buffer->append( "=\"" );
togayan 4:7dae52cf560f 329 SP_XmlStringCodec::encode( encoding, value, buffer );
togayan 4:7dae52cf560f 330 buffer->append( "\"" );
togayan 4:7dae52cf560f 331 }
togayan 4:7dae52cf560f 332 }
togayan 4:7dae52cf560f 333
togayan 4:7dae52cf560f 334 const SP_XmlNodeList * children = element->getChildren();
togayan 4:7dae52cf560f 335
togayan 4:7dae52cf560f 336 if( children->getLength() > 0 ) {
togayan 4:7dae52cf560f 337 if( SP_XmlNode::eCDATA != children->get( 0 )->getType() ) {
togayan 4:7dae52cf560f 338 buffer->append( level >= 0 ? ">\n" : ">" );
togayan 4:7dae52cf560f 339 } else {
togayan 4:7dae52cf560f 340 buffer->append( ">" );
togayan 4:7dae52cf560f 341 }
togayan 4:7dae52cf560f 342
togayan 4:7dae52cf560f 343 for( int j = 0; j < children->getLength(); j++ ) {
togayan 4:7dae52cf560f 344 dump( encoding, children->get( j ), buffer, level >= 0 ? level + 1 : -1 );
togayan 4:7dae52cf560f 345 }
togayan 4:7dae52cf560f 346
togayan 4:7dae52cf560f 347 if( SP_XmlNode::eCDATA != children->get( 0 )->getType() ) {
togayan 4:7dae52cf560f 348 for( int i = 0; i < level; i++ ) buffer->append( '\t' );
togayan 4:7dae52cf560f 349 }
togayan 4:7dae52cf560f 350 buffer->append( "</" );
togayan 4:7dae52cf560f 351 buffer->append( element->getName() );
togayan 4:7dae52cf560f 352 buffer->append( level >= 0 ? ">\n" : ">" );
togayan 4:7dae52cf560f 353 } else {
togayan 4:7dae52cf560f 354 buffer->append( level >= 0 ? "/>\n" : ">" );
togayan 4:7dae52cf560f 355 }
togayan 4:7dae52cf560f 356 } else {
togayan 4:7dae52cf560f 357 dump( encoding, node, buffer, level );
togayan 4:7dae52cf560f 358 }
togayan 4:7dae52cf560f 359 }