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/spcanonxml.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 <string.h> |
togayan | 4:7dae52cf560f | 7 | |
togayan | 4:7dae52cf560f | 8 | #include "spcanonxml.hpp" |
togayan | 4:7dae52cf560f | 9 | |
togayan | 4:7dae52cf560f | 10 | #include "spxmlnode.hpp" |
togayan | 4:7dae52cf560f | 11 | #include "spxmlutils.hpp" |
togayan | 4:7dae52cf560f | 12 | #include "spxmlcodec.hpp" |
togayan | 4:7dae52cf560f | 13 | |
togayan | 4:7dae52cf560f | 14 | SP_CanonXmlBuffer :: SP_CanonXmlBuffer( const SP_XmlNode * node ) |
togayan | 4:7dae52cf560f | 15 | { |
togayan | 4:7dae52cf560f | 16 | mBuffer = new SP_XmlStringBuffer(); |
togayan | 4:7dae52cf560f | 17 | dump( node, mBuffer ); |
togayan | 4:7dae52cf560f | 18 | } |
togayan | 4:7dae52cf560f | 19 | |
togayan | 4:7dae52cf560f | 20 | SP_CanonXmlBuffer :: ~SP_CanonXmlBuffer() |
togayan | 4:7dae52cf560f | 21 | { |
togayan | 4:7dae52cf560f | 22 | if( NULL != mBuffer ) delete mBuffer; |
togayan | 4:7dae52cf560f | 23 | mBuffer = NULL; |
togayan | 4:7dae52cf560f | 24 | } |
togayan | 4:7dae52cf560f | 25 | |
togayan | 4:7dae52cf560f | 26 | const char * SP_CanonXmlBuffer :: getBuffer() const |
togayan | 4:7dae52cf560f | 27 | { |
togayan | 4:7dae52cf560f | 28 | return mBuffer->getBuffer(); |
togayan | 4:7dae52cf560f | 29 | } |
togayan | 4:7dae52cf560f | 30 | |
togayan | 4:7dae52cf560f | 31 | int SP_CanonXmlBuffer :: getSize() const |
togayan | 4:7dae52cf560f | 32 | { |
togayan | 4:7dae52cf560f | 33 | return mBuffer->getSize(); |
togayan | 4:7dae52cf560f | 34 | } |
togayan | 4:7dae52cf560f | 35 | |
togayan | 4:7dae52cf560f | 36 | void SP_CanonXmlBuffer :: canonEncode( const char * value, |
togayan | 4:7dae52cf560f | 37 | SP_XmlStringBuffer * buffer ) |
togayan | 4:7dae52cf560f | 38 | { |
togayan | 4:7dae52cf560f | 39 | SP_XmlStringBuffer temp; |
togayan | 4:7dae52cf560f | 40 | SP_XmlStringCodec::encode( "", value, &temp ); |
togayan | 4:7dae52cf560f | 41 | |
togayan | 4:7dae52cf560f | 42 | for( const char * pos = temp.getBuffer(); '\0' != *pos; pos++ ) { |
togayan | 4:7dae52cf560f | 43 | if( '\r' == *pos ) { |
togayan | 4:7dae52cf560f | 44 | } else if( '\n' == *pos ) { |
togayan | 4:7dae52cf560f | 45 | buffer->append( " " ); |
togayan | 4:7dae52cf560f | 46 | } else { |
togayan | 4:7dae52cf560f | 47 | buffer->append( *pos ); |
togayan | 4:7dae52cf560f | 48 | } |
togayan | 4:7dae52cf560f | 49 | } |
togayan | 4:7dae52cf560f | 50 | } |
togayan | 4:7dae52cf560f | 51 | |
togayan | 4:7dae52cf560f | 52 | void SP_CanonXmlBuffer :: dump( |
togayan | 4:7dae52cf560f | 53 | const SP_XmlNode * node, SP_XmlStringBuffer * buffer ) |
togayan | 4:7dae52cf560f | 54 | { |
togayan | 4:7dae52cf560f | 55 | if( NULL == node ) return; |
togayan | 4:7dae52cf560f | 56 | |
togayan | 4:7dae52cf560f | 57 | if( SP_XmlNode::eXMLDOC == node->getType() ) { |
togayan | 4:7dae52cf560f | 58 | SP_XmlDocument * document = static_cast<SP_XmlDocument*>((SP_XmlNode*)node); |
togayan | 4:7dae52cf560f | 59 | const SP_XmlNodeList * children = document->getChildren(); |
togayan | 4:7dae52cf560f | 60 | for( int j = 0; j < children->getLength(); j++ ) { |
togayan | 4:7dae52cf560f | 61 | dump( children->get( j ), buffer ); |
togayan | 4:7dae52cf560f | 62 | } |
togayan | 4:7dae52cf560f | 63 | } else if( SP_XmlNode::eCDATA == node->getType() ) { |
togayan | 4:7dae52cf560f | 64 | SP_XmlCDataNode * cdata = static_cast<SP_XmlCDataNode*>((SP_XmlNode*)node); |
togayan | 4:7dae52cf560f | 65 | |
togayan | 4:7dae52cf560f | 66 | canonEncode( cdata->getText(), buffer ); |
togayan | 4:7dae52cf560f | 67 | } else if( SP_XmlNode::ePI == node->getType() ) { |
togayan | 4:7dae52cf560f | 68 | SP_XmlPINode * piNode = static_cast<SP_XmlPINode*>((SP_XmlNode*)node); |
togayan | 4:7dae52cf560f | 69 | |
togayan | 4:7dae52cf560f | 70 | buffer->append( "<?" ); |
togayan | 4:7dae52cf560f | 71 | buffer->append( piNode->getTarget() ); |
togayan | 4:7dae52cf560f | 72 | if( '\0' != *( piNode->getTarget() ) ) buffer->append( ' ' ); |
togayan | 4:7dae52cf560f | 73 | buffer->append( piNode->getData() ); |
togayan | 4:7dae52cf560f | 74 | buffer->append( "?>" ); |
togayan | 4:7dae52cf560f | 75 | } else if( SP_XmlNode::eCOMMENT == node->getType() ) { |
togayan | 4:7dae52cf560f | 76 | // ignore |
togayan | 4:7dae52cf560f | 77 | } else if( SP_XmlNode::eELEMENT == node->getType() ) { |
togayan | 4:7dae52cf560f | 78 | dumpElement( node, buffer ); |
togayan | 4:7dae52cf560f | 79 | } else if( SP_XmlNode::eDOCDECL == node->getType() ) { |
togayan | 4:7dae52cf560f | 80 | // ignore |
togayan | 4:7dae52cf560f | 81 | } else if( SP_XmlNode::eDOCTYPE == node->getType() ) { |
togayan | 4:7dae52cf560f | 82 | // ignore |
togayan | 4:7dae52cf560f | 83 | } else { |
togayan | 4:7dae52cf560f | 84 | // ignore |
togayan | 4:7dae52cf560f | 85 | } |
togayan | 4:7dae52cf560f | 86 | } |
togayan | 4:7dae52cf560f | 87 | |
togayan | 4:7dae52cf560f | 88 | void SP_CanonXmlBuffer :: dumpElement( |
togayan | 4:7dae52cf560f | 89 | const SP_XmlNode * node, SP_XmlStringBuffer * buffer ) |
togayan | 4:7dae52cf560f | 90 | { |
togayan | 4:7dae52cf560f | 91 | if( NULL == node ) return; |
togayan | 4:7dae52cf560f | 92 | |
togayan | 4:7dae52cf560f | 93 | if( SP_XmlNode::eELEMENT == node->getType() ) { |
togayan | 4:7dae52cf560f | 94 | SP_XmlElementNode * element = static_cast<SP_XmlElementNode*>((SP_XmlNode*)node); |
togayan | 4:7dae52cf560f | 95 | buffer->append( "<" ); |
togayan | 4:7dae52cf560f | 96 | buffer->append( element->getName() ); |
togayan | 4:7dae52cf560f | 97 | |
togayan | 4:7dae52cf560f | 98 | int i = 0; |
togayan | 4:7dae52cf560f | 99 | |
togayan | 4:7dae52cf560f | 100 | SP_XmlArrayList attrList; |
togayan | 4:7dae52cf560f | 101 | for( i = 0; i < element->getAttrCount(); i++ ) { |
togayan | 4:7dae52cf560f | 102 | attrList.append( (void*)element->getAttr( i, NULL ) ); |
togayan | 4:7dae52cf560f | 103 | } |
togayan | 4:7dae52cf560f | 104 | attrList.sort( reinterpret_cast<int(*)(const void*, const void*)>(strcmp) ); |
togayan | 4:7dae52cf560f | 105 | |
togayan | 4:7dae52cf560f | 106 | const char * name = NULL, * value = NULL; |
togayan | 4:7dae52cf560f | 107 | for( i = 0; i < attrList.getCount(); i++ ) { |
togayan | 4:7dae52cf560f | 108 | name = (char*)attrList.getItem( i ); |
togayan | 4:7dae52cf560f | 109 | value = element->getAttrValue( name ); |
togayan | 4:7dae52cf560f | 110 | if( NULL != name && NULL != value ) { |
togayan | 4:7dae52cf560f | 111 | buffer->append( ' ' ); |
togayan | 4:7dae52cf560f | 112 | buffer->append( name ); |
togayan | 4:7dae52cf560f | 113 | buffer->append( "=\"" ); |
togayan | 4:7dae52cf560f | 114 | canonEncode( value, buffer ); |
togayan | 4:7dae52cf560f | 115 | buffer->append( "\"" ); |
togayan | 4:7dae52cf560f | 116 | } |
togayan | 4:7dae52cf560f | 117 | } |
togayan | 4:7dae52cf560f | 118 | |
togayan | 4:7dae52cf560f | 119 | const SP_XmlNodeList * children = element->getChildren(); |
togayan | 4:7dae52cf560f | 120 | |
togayan | 4:7dae52cf560f | 121 | buffer->append( ">" ); |
togayan | 4:7dae52cf560f | 122 | |
togayan | 4:7dae52cf560f | 123 | for( int j = 0; j < children->getLength(); j++ ) { |
togayan | 4:7dae52cf560f | 124 | dump( children->get( j ), buffer ); |
togayan | 4:7dae52cf560f | 125 | } |
togayan | 4:7dae52cf560f | 126 | |
togayan | 4:7dae52cf560f | 127 | buffer->append( "</" ); |
togayan | 4:7dae52cf560f | 128 | buffer->append( element->getName() ); |
togayan | 4:7dae52cf560f | 129 | buffer->append( ">" ); |
togayan | 4:7dae52cf560f | 130 | } else { |
togayan | 4:7dae52cf560f | 131 | dump( node, buffer ); |
togayan | 4:7dae52cf560f | 132 | } |
togayan | 4:7dae52cf560f | 133 | } |