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

Committer:
hlipka
Date:
Wed Nov 24 20:52:14 2010 +0000
Revision:
0:3fa97f2c0505
initial revision

Who changed what in which revision?

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