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/
spxml/spdomparser.cpp@4:7dae52cf560f, 2012-08-20 (annotated)
- Committer:
- togayan
- Date:
- Mon Aug 20 13:27:17 2012 +0000
- Revision:
- 4:7dae52cf560f
1st revision
Who changed what in which revision?
User | Revision | Line number | New 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 | } |