下载TinyXml库,集成到Cococs2d-x工程中,编译运行,写测试代码,一切顺利!

可是CygWin编译,生成APK后,在Android真机上跑,程序崩溃!这可愁死人了!!!!!

于是,周末有空看了下Cocos2dx的源码.

发现Android下的文件都是从zip里面读取,所以给Tinyxml增加了一个方法 可以使它在android下正确读取xml文件.


[html] ​​view plain​​​​copy​

  1. /// Load Xml form memory buff. Returns true if successful.  
  2. bool TiXmlDocument::LoadMemory( const char * pBuff, int length, TiXmlEncoding encoding )  
  3. {  
  4.     if ( !pBuff || length == 0 )   
  5.     {  
  6.         SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN );  
  7.         return false;  
  8.     }  

  9.     // If we have a file, assume it is all one big XML file, and read it in.  
  10.     // The document parser may decide the document ends sooner than the entire file, however.  
  11.     TIXML_STRING data;  
  12.     data.reserve( length );  

  13.     char* buf = new char[ length+1 ];  
  14.     buf[0] = 0;  

  15.     memcpy( buf, pBuff, length );  

  16.     const char* lastPos = buf;  
  17.     const char* p = buf;  

  18.     buf[length] = 0;  
  19.     while( *p ) {  
  20.         assert( p < (buf+length) );  
  21.         if ( *p == 0xa ) {  
  22.             // Newline character. No special rules for this. Append all the characters  
  23.             // since the last string, and include the newline.  
  24.             data.append( lastPos, (p-lastPos+1) );  // append, include the newline  
  25.             ++p;                                    // move past the newline  
  26.             lastPos = p;                            // and point to the new buffer (may be 0)  
  27.             assert( p <= (buf+length) );  
  28.         }  
  29.         else if ( *p == 0xd ) {  
  30.             // Carriage return. Append what we have so far, then  
  31.             // handle moving forward in the buffer.  
  32.             if ( (p-lastPos) > 0 ) {  
  33.                 data.append( lastPos, p-lastPos );  // do not add the CR  
  34.             }  
  35.             data += (char)0xa;                      // a proper newline  

  36.             if ( *(p+1) == 0xa ) {  
  37.                 // Carriage return - new line sequence  
  38.                 p += 2;  
  39.                 lastPos = p;  
  40.                 assert( p <= (buf+length) );  
  41.             }  
  42.             else {  
  43.                 // it was followed by something else...that is presumably characters again.  
  44.                 ++p;  
  45.                 lastPos = p;  
  46.                 assert( p <= (buf+length) );  
  47.             }  
  48.         }  
  49.         else {  
  50.             ++p;  
  51.         }  
  52.     }  
  53.     // Handle any left over characters.  
  54.     if ( p-lastPos ) {  
  55.         data.append( lastPos, p-lastPos );  
  56.     }         
  57.     delete [] buf;  
  58.     buf = 0;  

  59.     Parse( data.c_str(), 0, encoding );  

  60.     if (  Error() )  
  61.     {  
  62.         return false;  
  63.     }  

  64.     return true;  
  65. }  


传入一个buff,然后交给TineXml解析。


使用示例:

 TiXmlDocument* pXMLDoc = new TiXmlDocument( szSchemeName );

 unsigned long nLength = 0;

 char* pBuff = (char*)cocos2d::CCFileUtils::sharedFileUtils()->getFileData(cocos2d::CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(szSchemeName),"rt", &nLength );

 pXMLDoc->LoadMemory( pBuff, nLength );

 SAFE_DELARR( pBuff );


.... 你的代码在这里


delete pXMLDoc;