📄 tinyxml.cpp
字号:
}}TiXmlNode* TiXmlElement::Clone() const{ TiXmlElement* clone = new TiXmlElement( Value() ); if ( !clone ) return 0; CopyTo( clone ); return clone;}TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ){ tabsize = 4; ClearError();}TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ){ tabsize = 4; value = documentName; ClearError();}#ifdef TIXML_USE_STLTiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ){ tabsize = 4; value = documentName; ClearError();}#endifTiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ){ copy.CopyTo( this );}void TiXmlDocument::operator=( const TiXmlDocument& copy ){ Clear(); copy.CopyTo( this );}bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ){ // See STL_STRING_BUG below. StringToBuffer buf( value ); if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) 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, TiXmlEncoding encoding ){ // Delete the existing data: Clear(); location.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(), 0, encoding ); if ( Error() ) return false; else return true; } SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); 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;}void TiXmlDocument::CopyTo( TiXmlDocument* target ) const{ TiXmlNode::CopyTo( target ); target->error = error; target->errorDesc = errorDesc.c_str (); TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } }TiXmlNode* TiXmlDocument::Clone() const{ TiXmlDocument* clone = new TiXmlDocument(); if ( !clone ) return 0; CopyTo( 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) << "\""; }}int TiXmlAttribute::QueryIntValue( int* ival ) const{ if ( sscanf( value.c_str(), "%d", ival ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE;}int TiXmlAttribute::QueryDoubleValue( double* dval ) const{ if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE;}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 ());}TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ){ copy.CopyTo( this );}void TiXmlComment::operator=( const TiXmlComment& base ){ Clear(); base.CopyTo( this );}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) << value; (*stream) << "-->";}void TiXmlComment::CopyTo( TiXmlComment* target ) const{ TiXmlNode::CopyTo( target );}TiXmlNode* TiXmlComment::Clone() const{ TiXmlComment* clone = new TiXmlComment(); if ( !clone ) return 0; CopyTo( 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 );}void TiXmlText::CopyTo( TiXmlText* target ) const{ TiXmlNode::CopyTo( target );}TiXmlNode* TiXmlText::Clone() const{ TiXmlText* clone = 0; clone = new TiXmlText( "" ); if ( !clone ) return 0; CopyTo( clone ); return clone;}TiXmlDeclaration::TiXmlDeclaration( const char * _version, const char * _encoding, const char * _standalone ) : TiXmlNode( TiXmlNode::DECLARATION ){ version = _version; encoding = _encoding; standalone = _standalone;}#ifdef TIXML_USE_STLTiXmlDeclaration::TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ) : TiXmlNode( TiXmlNode::DECLARATION ){ version = _version; encoding = _encoding; standalone = _standalone;}#endifTiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) : TiXmlNode( TiXmlNode::DECLARATION ){ copy.CopyTo( this ); }void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ){ Clear(); copy.CopyTo( this );}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) << "?>";}void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const{ TiXmlNode::CopyTo( target ); target->version = version; target->encoding = encoding; target->standalone = standalone;}TiXmlNode* TiXmlDeclaration::Clone() const{ TiXmlDeclaration* clone = new TiXmlDeclaration(); if ( !clone ) return 0; CopyTo( clone ); 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 here! It is unknown.}void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const{ TiXmlNode::CopyTo( target );}TiXmlNode* TiXmlUnknown::Clone() const{ TiXmlUnknown* clone = new TiXmlUnknown(); if ( !clone ) return 0; CopyTo( 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_STL TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base){ TIXML_STRING tag; tag.reserve( 8 * 1000 ); base.StreamIn( &in, &tag ); base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); return in;}#endifTIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base){ base.StreamOut (& out); return out;}#ifdef TIXML_USE_STL std::string & operator<< (std::string& out, const TiXmlNode& base ){ std::ostringstream os_stream( std::ostringstream::out ); base.StreamOut( &os_stream ); out.append( os_stream.str() ); return out;}#endifTiXmlHandle TiXmlHandle::FirstChild() const{ if ( node ) { TiXmlNode* child = node->FirstChild(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const{ if ( node ) { TiXmlNode* child = node->FirstChild( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::FirstChildElement() const{ if ( node ) { TiXmlElement* child = node->FirstChildElement(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const{ if ( node ) { TiXmlElement* child = node->FirstChildElement( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::Child( int count ) const{ if ( node ) { int i; TiXmlNode* child = node->FirstChild(); for ( i=0; child && i<count; child = child->NextSibling(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const{ if ( node ) { int i; TiXmlNode* child = node->FirstChild( value ); for ( i=0; child && i<count; child = child->NextSibling( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::ChildElement( int count ) const{ if ( node ) { int i; TiXmlElement* child = node->FirstChildElement(); for ( i=0; child && i<count; child = child->NextSiblingElement(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const{ if ( node ) { int i; TiXmlElement* child = node->FirstChildElement( value ); for ( i=0; child && i<count; child = child->NextSiblingElement( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -