⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tinyxml.c

📁 一个简单的xml解析代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            }            node->Print( cfile, depth + 1 );        }        fprintf( cfile, "\n" );        for( i = 0; i < depth; ++i )            fprintf( cfile, "    " );        fprintf( cfile, "</%s>", value.c_str() );    }}void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const {    ( *stream ) << "<" << value;    TiXmlAttribute* attrib;    for( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) {        ( *stream ) << " ";        attrib->StreamOut( stream );    }    // If this node has children, give it a closing tag. Else    // make it an empty tag.    TiXmlNode* node;    if( firstChild ) {        ( *stream ) << ">";        for( node = firstChild; node; node = node->NextSibling() ) {            node->StreamOut( stream );        }        ( *stream ) << "</" << value << ">";    } else {        ( *stream ) << " />";    }}TiXmlNode* TiXmlElement::Clone() const {    TiXmlElement * clone = new TiXmlElement( Value() );    if( !clone )        return 0;    CopyToClone( clone );    // Clone the attributes, then clone the children.    TiXmlAttribute* attribute = 0;    for( attribute = attributeSet.First();       attribute;       attribute = attribute->Next() ) {        clone->SetAttribute( attribute->Name(), attribute->Value() );    }    TiXmlNode* node = 0;    for( node = firstChild; node; node = node->NextSibling() ) {        clone->LinkEndChild( node->Clone() );    }    return clone;}TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) {    error = false;    //	ignoreWhiteSpace = true;}TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) {    //	ignoreWhiteSpace = true;    value = documentName;    error = false;}bool TiXmlDocument::LoadFile() {    // See STL_STRING_BUG below.    StringToBuffer buf( value );    if( buf.buffer && LoadFile( buf.buffer ) )        return true;    return false;}bool TiXmlDocument::SaveFile() const {    // See STL_STRING_BUG below.    StringToBuffer buf( value );    if( buf.buffer && SaveFile( buf.buffer ) )        return true;    return false;}bool TiXmlDocument::LoadFile( const char* filename ) {    // Delete the existing data:    Clear();    // There was a really terrifying little bug here. The code:    //		value = filename    // in the STL case, cause the assignment method of the std::string to    // be called. What is strange, is that the std::string had the same    // address as it's c_str() method, and so bad things happen. Looks    // like a bug in the Microsoft STL implementation.    // See STL_STRING_BUG above.    // Fixed with the StringToBuffer class.    value = filename;    FILE* file = fopen( value.c_str (), "r" );    if( file ) {        // Get the file size, so we can pre-allocate the string. HUGE speed impact.        long length = 0;        fseek( file, 0, SEEK_END );        length = ftell( file );        fseek( file, 0, SEEK_SET );        // Strange case, but good to handle up front.        if( length == 0 ) {            fclose( file );            return false;        }        // If we have a file, assume it is all one big XML file, and read it in.        // The document parser may decide the document ends sooner than the entire file, however.        TIXML_STRING data;        data.reserve( length );        const int BUF_SIZE = 2048;        char buf[ BUF_SIZE ];        while( fgets( buf, BUF_SIZE, file ) ) {            data += buf;        }        fclose( file );        Parse( data.c_str() );        if( Error() )            return false;        else            return true;    }    SetError( TIXML_ERROR_OPENING_FILE );    return false;}bool TiXmlDocument::SaveFile( const char * filename ) const {    // The old c stuff lives on...    FILE * fp = fopen( filename, "w" );    if( fp ) {        Print( fp, 0 );        fclose( fp );        return true;    }    return false;}TiXmlNode* TiXmlDocument::Clone() const {    TiXmlDocument * clone = new TiXmlDocument();    if( !clone )        return 0;    CopyToClone( clone );    clone->error = error;    clone->errorDesc = errorDesc.c_str ();    TiXmlNode* node = 0;    for( node = firstChild; node; node = node->NextSibling() ) {        clone->LinkEndChild( node->Clone() );    }    return clone;}void TiXmlDocument::Print( FILE* cfile, int depth ) const {    TiXmlNode * node;    for( node = FirstChild(); node; node = node->NextSibling() ) {        node->Print( cfile, depth );        fprintf( cfile, "\n" );    }}void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const {    TiXmlNode * node;    for( node = FirstChild(); node; node = node->NextSibling() ) {        node->StreamOut( out );        // Special rule for streams: stop after the root element.        // The stream in code will only read one element, so don't        // write more than one.        if( node->ToElement() )            break;    }}TiXmlAttribute* TiXmlAttribute::Next() const {    // We are using knowledge of the sentinel. The sentinel    // have a value or name.    if( next->value.empty() && next->name.empty() )        return 0;    return next;}TiXmlAttribute* TiXmlAttribute::Previous() const {    // We are using knowledge of the sentinel. The sentinel    // have a value or name.    if( prev->value.empty() && prev->name.empty() )        return 0;    return prev;}void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const {    TIXML_STRING n, v;    PutString( Name(), &n );    PutString( Value(), &v );    if( value.find ( '\"' ) == TIXML_STRING::npos )        fprintf ( cfile, "%s=\"%s\"", n.c_str(), v.c_str() );    else        fprintf ( cfile, "%s='%s'", n.c_str(), v.c_str() );}void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const {    if( value.find( '\"' ) != TIXML_STRING::npos ) {        PutString( name, stream );        ( *stream ) << "=" << "'";        PutString( value, stream );        ( *stream ) << "'";    } else {        PutString( name, stream );        ( *stream ) << "=" << "\"";        PutString( value, stream );        ( *stream ) << "\"";    }}void TiXmlAttribute::SetIntValue( int value ) {    char buf [ 64 ];    sprintf ( buf, "%d", value );    SetValue ( buf );}void TiXmlAttribute::SetDoubleValue( double value ) {    char buf [ 64 ];    sprintf ( buf, "%lf", value );    SetValue ( buf );}const int TiXmlAttribute::IntValue() const {    return atoi ( value.c_str () );}const double TiXmlAttribute::DoubleValue() const {    return atof ( value.c_str () );}void TiXmlComment::Print( FILE* cfile, int depth ) const {    for( int i = 0; i < depth; i++ ) {        fputs( "    ", cfile );    }    fprintf( cfile, "<!--%s-->", value.c_str() );}void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const {    ( *stream ) << "<!--";    PutString( value, stream );    ( *stream ) << "-->";}TiXmlNode* TiXmlComment::Clone() const {    TiXmlComment * clone = new TiXmlComment();    if( !clone )        return 0;    CopyToClone( clone );    return clone;}void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const {    TIXML_STRING buffer;    PutString( value, &buffer );    fprintf( cfile, "%s", buffer.c_str() );}void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const {    PutString( value, stream );}TiXmlNode* TiXmlText::Clone() const {    TiXmlText * clone = 0;    clone = new TiXmlText( "" );    if( !clone )        return 0;    CopyToClone( clone );    return clone;}TiXmlDeclaration::TiXmlDeclaration( const char * _version,                                    const char * _encoding,                                    const char * _standalone ): TiXmlNode( TiXmlNode::DECLARATION ) {    version = _version;    encoding = _encoding;    standalone = _standalone;}void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const {    fprintf ( cfile, "<?xml " );    if( !version.empty() )        fprintf ( cfile, "version=\"%s\" ", version.c_str () );    if( !encoding.empty() )        fprintf ( cfile, "encoding=\"%s\" ", encoding.c_str () );    if( !standalone.empty() )        fprintf ( cfile, "standalone=\"%s\" ", standalone.c_str () );    fprintf ( cfile, "?>" );}void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const {    ( *stream ) << "<?xml ";    if( !version.empty() ) {        ( *stream ) << "version=\"";        PutString( version, stream );        ( *stream ) << "\" ";    }    if( !encoding.empty() ) {        ( *stream ) << "encoding=\"";        PutString( encoding, stream );        ( *stream ) << "\" ";    }    if( !standalone.empty() ) {        ( *stream ) << "standalone=\"";        PutString( standalone, stream );        ( *stream ) << "\" ";    }    ( *stream ) << "?>";}TiXmlNode* TiXmlDeclaration::Clone() const {    TiXmlDeclaration * clone = new TiXmlDeclaration();    if( !clone )        return 0;    CopyToClone( clone );    clone->version = version;    clone->encoding = encoding;    clone->standalone = standalone;    return clone;}void TiXmlUnknown::Print( FILE* cfile, int depth ) const {    for( int i = 0; i < depth; i++ )        fprintf( cfile, "    " );    fprintf( cfile, "%s", value.c_str() );}void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const {    ( *stream ) << "<" << value << ">";     // Don't use entities hear! It is unknown.}TiXmlNode* TiXmlUnknown::Clone() const {    TiXmlUnknown * clone = new TiXmlUnknown();    if( !clone )        return 0;    CopyToClone( clone );    return clone;}TiXmlAttributeSet::TiXmlAttributeSet() {    sentinel.next = &sentinel;    sentinel.prev = &sentinel;}TiXmlAttributeSet::~TiXmlAttributeSet() {    assert( sentinel.next == &sentinel );    assert( sentinel.prev == &sentinel );}void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) {    assert( !Find( addMe->Name() ) );   // Shouldn't be multiply adding to the set.    addMe->next = &sentinel;    addMe->prev = sentinel.prev;    sentinel.prev->next = addMe;    sentinel.prev = addMe;}void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) {    TiXmlAttribute * node;    for( node = sentinel.next; node != &sentinel; node = node->next ) {        if( node == removeMe ) {            node->prev->next = node->next;            node->next->prev = node->prev;            node->next = 0;            node->prev = 0;            return ;        }    }    assert( 0 );        // we tried to remove a non-linked attribute.}TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) const {    TiXmlAttribute * node;    for( node = sentinel.next; node != &sentinel; node = node->next ) {        if( node->name == name )            return node;    }    return 0;}#ifdef TIXML_USE_STLTIXML_ISTREAM & operator >> ( TIXML_ISTREAM & in, TiXmlNode & base ) {    TIXML_STRING tag;    tag.reserve( 8 * 1000 );    base.StreamIn( &in, &tag );    base.Parse( tag.c_str() );    return in;}#endifTIXML_OSTREAM & operator<< ( TIXML_OSTREAM & out, const TiXmlNode & base ) {    base.StreamOut ( & out );    return out;}/*add by yang@iip for common use*/TiXmlDocument * loadXmlCfgFile( bool exitOnError, char *xmlFileName ) {    if( !xmlFileName ) {        printf( "Unknown config XML file name!\n" );        return NULL;    }    //printf("xml filename: %s\n",xmlFileName);    TiXmlDocument *pXmlTree = new TiXmlDocument( xmlFileName );    if( !pXmlTree ) {        printf( "(%s:%d)Alloc XML treee for %s error !", __FILE__, __LINE__, xmlFileName );        if( exitOnError ) {            exit( 0 );        }        return NULL;    }    if( !pXmlTree->LoadFile() ) {        printf( "Load config file %s failed, %s", xmlFileName, pXmlTree->ErrorDesc() );        delete pXmlTree;        if( exitOnError ) {            exit( 0 );        }        return NULL;    }    return( TiXmlDocument* ) pXmlTree;}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -