00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #define TIXML_USE_STL
00032
00033 #ifndef TINYXML_INCLUDED
00034 #define TINYXML_INCLUDED
00035
00036 #ifdef _MSC_VER
00037 #pragma warning( push )
00038 #pragma warning( disable : 4530 )
00039 #pragma warning( disable : 4786 )
00040 #endif
00041
00042 #include <ctype.h>
00043 #include <stdio.h>
00044 #include <stdlib.h>
00045 #include <string.h>
00046 #include <assert.h>
00047
00048
00049 #if defined( _DEBUG ) && !defined( DEBUG )
00050 #define DEBUG
00051 #endif
00052
00053 #ifdef TIXML_USE_STL
00054 #include <string>
00055 #include <iostream>
00056 #include <sstream>
00057 #define TIXML_STRING std::string
00058 #else
00059 #include "tinystr.h"
00060 #define TIXML_STRING TiXmlString
00061 #endif
00062
00063
00064
00065
00066
00067 #define TIXML_SAFE
00068
00069 #ifdef TIXML_SAFE
00070 #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
00071
00072 #define TIXML_SNPRINTF _snprintf_s
00073 #define TIXML_SNSCANF _snscanf_s
00074 #define TIXML_SSCANF sscanf_s
00075 #elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
00076
00077
00078 #define TIXML_SNPRINTF _snprintf
00079 #define TIXML_SNSCANF _snscanf
00080 #elif defined(__GNUC__) && (__GNUC__ >= 3 )
00081
00082
00083 #define TIXML_SNPRINTF snprintf
00084 #define TIXML_SNSCANF snscanf
00085 #endif
00086 #endif
00087
00088 class TiXmlDocument;
00089 class TiXmlElement;
00090 class TiXmlComment;
00091 class TiXmlUnknown;
00092 class TiXmlAttribute;
00093 class TiXmlText;
00094 class TiXmlDeclaration;
00095 class TiXmlParsingData;
00096
00097 const int TIXML_MAJOR_VERSION = 2;
00098 const int TIXML_MINOR_VERSION = 5;
00099 const int TIXML_PATCH_VERSION = 3;
00100
00101
00102
00103
00104 struct TiXmlCursor
00105 {
00106 TiXmlCursor() { Clear(); }
00107 void Clear() { row = col = -1; }
00108
00109 int row;
00110 int col;
00111 };
00112
00113
00132 class TiXmlVisitor
00133 {
00134 public:
00135 virtual ~TiXmlVisitor() {}
00136
00138 virtual bool VisitEnter( const TiXmlDocument& ) { return true; }
00140 virtual bool VisitExit( const TiXmlDocument& ) { return true; }
00141
00143 virtual bool VisitEnter( const TiXmlElement& , const TiXmlAttribute* ) { return true; }
00145 virtual bool VisitExit( const TiXmlElement& ) { return true; }
00146
00148 virtual bool Visit( const TiXmlDeclaration& ) { return true; }
00150 virtual bool Visit( const TiXmlText& ) { return true; }
00152 virtual bool Visit( const TiXmlComment& ) { return true; }
00154 virtual bool Visit( const TiXmlUnknown& ) { return true; }
00155 };
00156
00157
00158 enum
00159 {
00160 TIXML_SUCCESS,
00161 TIXML_NO_ATTRIBUTE,
00162 TIXML_WRONG_TYPE
00163 };
00164
00165
00166
00167 enum TiXmlEncoding
00168 {
00169 TIXML_ENCODING_UNKNOWN,
00170 TIXML_ENCODING_UTF8,
00171 TIXML_ENCODING_LEGACY
00172 };
00173
00174 const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
00175
00198 class TiXmlBase
00199 {
00200 friend class TiXmlNode;
00201 friend class TiXmlElement;
00202 friend class TiXmlDocument;
00203
00204 public:
00205 TiXmlBase() : userData(0) {}
00206 virtual ~TiXmlBase() {}
00207
00217 virtual void Print( FILE* cfile, int depth ) const = 0;
00218
00225 static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; }
00226
00228 static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; }
00229
00248 int Row() const { return location.row + 1; }
00249 int Column() const { return location.col + 1; }
00250
00251 void SetUserData( void* user ) { userData = user; }
00252 void* GetUserData() { return userData; }
00253 const void* GetUserData() const { return userData; }
00254
00255
00256
00257 static const int utf8ByteTable[256];
00258
00259 virtual const char* Parse( const char* p,
00260 TiXmlParsingData* data,
00261 TiXmlEncoding encoding ) = 0;
00262
00266 static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out );
00267
00268 enum
00269 {
00270 TIXML_NO_ERROR = 0,
00271 TIXML_ERROR,
00272 TIXML_ERROR_OPENING_FILE,
00273 TIXML_ERROR_OUT_OF_MEMORY,
00274 TIXML_ERROR_PARSING_ELEMENT,
00275 TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
00276 TIXML_ERROR_READING_ELEMENT_VALUE,
00277 TIXML_ERROR_READING_ATTRIBUTES,
00278 TIXML_ERROR_PARSING_EMPTY,
00279 TIXML_ERROR_READING_END_TAG,
00280 TIXML_ERROR_PARSING_UNKNOWN,
00281 TIXML_ERROR_PARSING_COMMENT,
00282 TIXML_ERROR_PARSING_DECLARATION,
00283 TIXML_ERROR_DOCUMENT_EMPTY,
00284 TIXML_ERROR_EMBEDDED_NULL,
00285 TIXML_ERROR_PARSING_CDATA,
00286 TIXML_ERROR_DOCUMENT_TOP_ONLY,
00287
00288 TIXML_ERROR_STRING_COUNT
00289 };
00290
00291 protected:
00292
00293 static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding );
00294 inline static bool IsWhiteSpace( char c )
00295 {
00296 return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' );
00297 }
00298 inline static bool IsWhiteSpace( int c )
00299 {
00300 if ( c < 256 )
00301 return IsWhiteSpace( (char) c );
00302 return false;
00303 }
00304
00305 #ifdef TIXML_USE_STL
00306 static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag );
00307 static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag );
00308 #endif
00309
00310
00311
00312
00313
00314 static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
00315
00316
00317
00318
00319 static const char* ReadText( const char* in,
00320 TIXML_STRING* text,
00321 bool ignoreWhiteSpace,
00322 const char* endTag,
00323 bool ignoreCase,
00324 TiXmlEncoding encoding );
00325
00326
00327 static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );
00328
00329
00330
00331 inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )
00332 {
00333 assert( p );
00334 if ( encoding == TIXML_ENCODING_UTF8 )
00335 {
00336 *length = utf8ByteTable[ *((const unsigned char*)p) ];
00337 assert( *length >= 0 && *length < 5 );
00338 }
00339 else
00340 {
00341 *length = 1;
00342 }
00343
00344 if ( *length == 1 )
00345 {
00346 if ( *p == '&' )
00347 return GetEntity( p, _value, length, encoding );
00348 *_value = *p;
00349 return p+1;
00350 }
00351 else if ( *length )
00352 {
00353
00354
00355 for( int i=0; p[i] && i<*length; ++i ) {
00356 _value[i] = p[i];
00357 }
00358 return p + (*length);
00359 }
00360 else
00361 {
00362
00363 return 0;
00364 }
00365 }
00366
00367
00368
00369
00370 static bool StringEqual( const char* p,
00371 const char* endTag,
00372 bool ignoreCase,
00373 TiXmlEncoding encoding );
00374
00375 static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
00376
00377 TiXmlCursor location;
00378
00380 void* userData;
00381
00382
00383
00384 static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );
00385 static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );
00386 inline static int ToLower( int v, TiXmlEncoding encoding )
00387 {
00388 if ( encoding == TIXML_ENCODING_UTF8 )
00389 {
00390 if ( v < 128 ) return tolower( v );
00391 return v;
00392 }
00393 else
00394 {
00395 return tolower( v );
00396 }
00397 }
00398 static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
00399
00400 private:
00401 TiXmlBase( const TiXmlBase& );
00402 TiXmlBase& operator=( const TiXmlBase& base );
00403
00404 struct Entity
00405 {
00406 const char* str;
00407 unsigned int strLength;
00408 char chr;
00409 };
00410 enum
00411 {
00412 NUM_ENTITY = 5,
00413 MAX_ENTITY_LENGTH = 6
00414
00415 };
00416 static Entity entity[ NUM_ENTITY ];
00417 static bool condenseWhiteSpace;
00418 };
00419
00420
00427 class TiXmlNode : public TiXmlBase
00428 {
00429 friend class TiXmlDocument;
00430 friend class TiXmlElement;
00431
00432 public:
00433 #ifdef TIXML_USE_STL
00434
00438 friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
00439
00456 friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);
00457
00459 friend std::string& operator<< (std::string& out, const TiXmlNode& base );
00460
00461 #endif
00462
00466 enum NodeType
00467 {
00468 DOCUMENT,
00469 ELEMENT,
00470 COMMENT,
00471 UNKNOWN,
00472 TEXT,
00473 DECLARATION,
00474 TYPECOUNT
00475 };
00476
00477 virtual ~TiXmlNode();
00478
00491 const char *Value() const { return value.c_str (); }
00492
00493 #ifdef TIXML_USE_STL
00494
00498 const std::string& ValueStr() const { return value; }
00499 #endif
00500
00501 const TIXML_STRING& ValueTStr() const { return value; }
00502
00512 void SetValue(const char * _value) { value = _value;}
00513
00514 #ifdef TIXML_USE_STL
00515
00516 void SetValue( const std::string& _value ) { value = _value; }
00517 #endif
00518
00520 void Clear();
00521
00523 TiXmlNode* Parent() { return parent; }
00524 const TiXmlNode* Parent() const { return parent; }
00525
00526 const TiXmlNode* FirstChild() const { return firstChild; }
00527 TiXmlNode* FirstChild() { return firstChild; }
00528 const TiXmlNode* FirstChild( const char * value ) const;
00529
00530 TiXmlNode* FirstChild( const char * _value ) {
00531
00532
00533 return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value ));
00534 }
00535 const TiXmlNode* LastChild() const { return lastChild; }
00536 TiXmlNode* LastChild() { return lastChild; }
00537
00538 const TiXmlNode* LastChild( const char * value ) const;
00539 TiXmlNode* LastChild( const char * _value ) {
00540 return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value ));
00541 }
00542
00543 #ifdef TIXML_USE_STL
00544 const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); }
00545 TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); }
00546 const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); }
00547 TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); }
00548 #endif
00549
00566 const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const;
00567 TiXmlNode* IterateChildren( const TiXmlNode* previous ) {
00568 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) );
00569 }
00570
00572 const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const;
00573 TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) {
00574 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) );
00575 }
00576
00577 #ifdef TIXML_USE_STL
00578 const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); }
00579 TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); }
00580 #endif
00581
00585 TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
00586
00587
00597 TiXmlNode* LinkEndChild( TiXmlNode* addThis );
00598
00602 TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
00603
00607 TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
00608
00612 TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
00613
00615 bool RemoveChild( TiXmlNode* removeThis );
00616
00618 const TiXmlNode* PreviousSibling() const { return prev; }
00619 TiXmlNode* PreviousSibling() { return prev; }
00620
00622 const TiXmlNode* PreviousSibling( const char * ) const;
00623 TiXmlNode* PreviousSibling( const char *_prev ) {
00624 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) );
00625 }
00626
00627 #ifdef TIXML_USE_STL
00628 const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); }
00629 TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); }
00630 const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); }
00631 TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); }
00632 #endif
00633
00635 const TiXmlNode* NextSibling() const { return next; }
00636 TiXmlNode* NextSibling() { return next; }
00637
00639 const TiXmlNode* NextSibling( const char * ) const;
00640 TiXmlNode* NextSibling( const char* _next ) {
00641 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) );
00642 }
00643
00648 const TiXmlElement* NextSiblingElement() const;
00649 TiXmlElement* NextSiblingElement() {
00650 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() );
00651 }
00652
00657 const TiXmlElement* NextSiblingElement( const char * ) const;
00658 TiXmlElement* NextSiblingElement( const char *_next ) {
00659 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) );
00660 }
00661
00662 #ifdef TIXML_USE_STL
00663 const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); }
00664 TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); }
00665 #endif
00666
00668 const TiXmlElement* FirstChildElement() const;
00669 TiXmlElement* FirstChildElement() {
00670 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() );
00671 }
00672
00674 const TiXmlElement* FirstChildElement( const char * _value ) const;
00675 TiXmlElement* FirstChildElement( const char * _value ) {
00676 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) );
00677 }
00678
00679 #ifdef TIXML_USE_STL
00680 const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); }
00681 TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); }
00682 #endif
00683
00688 int Type() const { return type; }
00689
00693 const TiXmlDocument* GetDocument() const;
00694 TiXmlDocument* GetDocument() {
00695 return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() );
00696 }
00697
00699 bool NoChildren() const { return !firstChild; }
00700
00701 virtual const TiXmlDocument* ToDocument() const { return 0; }
00702 virtual const TiXmlElement* ToElement() const { return 0; }
00703 virtual const TiXmlComment* ToComment() const { return 0; }
00704 virtual const TiXmlUnknown* ToUnknown() const { return 0; }
00705 virtual const TiXmlText* ToText() const { return 0; }
00706 virtual const TiXmlDeclaration* ToDeclaration() const { return 0; }
00707
00708 virtual TiXmlDocument* ToDocument() { return 0; }
00709 virtual TiXmlElement* ToElement() { return 0; }
00710 virtual TiXmlComment* ToComment() { return 0; }
00711 virtual TiXmlUnknown* ToUnknown() { return 0; }
00712 virtual TiXmlText* ToText() { return 0; }
00713 virtual TiXmlDeclaration* ToDeclaration() { return 0; }
00714
00718 virtual TiXmlNode* Clone() const = 0;
00719
00742 virtual bool Accept( TiXmlVisitor* visitor ) const = 0;
00743
00744 protected:
00745 TiXmlNode( NodeType _type );
00746
00747
00748
00749 void CopyTo( TiXmlNode* target ) const;
00750
00751 #ifdef TIXML_USE_STL
00752
00753 virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0;
00754 #endif
00755
00756
00757 TiXmlNode* Identify( const char* start, TiXmlEncoding encoding );
00758
00759 TiXmlNode* parent;
00760 NodeType type;
00761
00762 TiXmlNode* firstChild;
00763 TiXmlNode* lastChild;
00764
00765 TIXML_STRING value;
00766
00767 TiXmlNode* prev;
00768 TiXmlNode* next;
00769
00770 private:
00771 TiXmlNode( const TiXmlNode& );
00772 TiXmlNode& operator=( const TiXmlNode& base );
00773 };
00774
00775
00783 class TiXmlAttribute : public TiXmlBase
00784 {
00785 friend class TiXmlAttributeSet;
00786
00787 public:
00789 TiXmlAttribute() : TiXmlBase()
00790 {
00791 document = 0;
00792 prev = next = 0;
00793 }
00794
00795 #ifdef TIXML_USE_STL
00796
00797 TiXmlAttribute( const std::string& _name, const std::string& _value )
00798 {
00799 name = _name;
00800 value = _value;
00801 document = 0;
00802 prev = next = 0;
00803 }
00804 #endif
00805
00807 TiXmlAttribute( const char * _name, const char * _value )
00808 {
00809 name = _name;
00810 value = _value;
00811 document = 0;
00812 prev = next = 0;
00813 }
00814
00815 const char* Name() const { return name.c_str(); }
00816 const char* Value() const { return value.c_str(); }
00817 #ifdef TIXML_USE_STL
00818 const std::string& ValueStr() const { return value; }
00819 #endif
00820 int IntValue() const;
00821 double DoubleValue() const;
00822
00823
00824 const TIXML_STRING& NameTStr() const { return name; }
00825
00835 int QueryIntValue( int* _value ) const;
00837 int QueryDoubleValue( double* _value ) const;
00838
00839 void SetName( const char* _name ) { name = _name; }
00840 void SetValue( const char* _value ) { value = _value; }
00841
00842 void SetIntValue( int _value );
00843 void SetDoubleValue( double _value );
00844
00845 #ifdef TIXML_USE_STL
00846
00847 void SetName( const std::string& _name ) { name = _name; }
00849 void SetValue( const std::string& _value ) { value = _value; }
00850 #endif
00851
00853 const TiXmlAttribute* Next() const;
00854 TiXmlAttribute* Next() {
00855 return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() );
00856 }
00857
00859 const TiXmlAttribute* Previous() const;
00860 TiXmlAttribute* Previous() {
00861 return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() );
00862 }
00863
00864 bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
00865 bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; }
00866 bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; }
00867
00868
00869
00870
00871 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
00872
00873
00874 virtual void Print( FILE* cfile, int depth ) const {
00875 Print( cfile, depth, 0 );
00876 }
00877 void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
00878
00879
00880
00881 void SetDocument( TiXmlDocument* doc ) { document = doc; }
00882
00883 private:
00884 TiXmlAttribute( const TiXmlAttribute& );
00885 TiXmlAttribute& operator=( const TiXmlAttribute& base );
00886
00887 TiXmlDocument* document;
00888 TIXML_STRING name;
00889 TIXML_STRING value;
00890 TiXmlAttribute* prev;
00891 TiXmlAttribute* next;
00892 };
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907 class TiXmlAttributeSet
00908 {
00909 public:
00910 TiXmlAttributeSet();
00911 ~TiXmlAttributeSet();
00912
00913 void Add( TiXmlAttribute* attribute );
00914 void Remove( TiXmlAttribute* attribute );
00915
00916 const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
00917 TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
00918 const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
00919 TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
00920
00921 const TiXmlAttribute* Find( const char* _name ) const;
00922 TiXmlAttribute* Find( const char* _name ) {
00923 return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) );
00924 }
00925 #ifdef TIXML_USE_STL
00926 const TiXmlAttribute* Find( const std::string& _name ) const;
00927 TiXmlAttribute* Find( const std::string& _name ) {
00928 return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) );
00929 }
00930
00931 #endif
00932
00933 private:
00934
00935
00936 TiXmlAttributeSet( const TiXmlAttributeSet& );
00937 TiXmlAttributeSet& operator=( const TiXmlAttributeSet& );
00938
00939 TiXmlAttribute sentinel;
00940 };
00941
00942
00947 class TiXmlElement : public TiXmlNode
00948 {
00949 public:
00951 TiXmlElement (const char * in_value);
00952
00953 #ifdef TIXML_USE_STL
00954
00955 TiXmlElement( const std::string& _value );
00956 #endif
00957
00958 TiXmlElement( const TiXmlElement& );
00959
00960 TiXmlElement& operator=( const TiXmlElement& base );
00961
00962 virtual ~TiXmlElement();
00963
00967 const char* Attribute( const char* name ) const;
00968
00975 const char* Attribute( const char* name, int* i ) const;
00976
00983 const char* Attribute( const char* name, double* d ) const;
00984
00992 int QueryIntAttribute( const char* name, int* _value ) const;
00994 int QueryDoubleAttribute( const char* name, double* _value ) const;
00996 int QueryFloatAttribute( const char* name, float* _value ) const {
00997 double d;
00998 int result = QueryDoubleAttribute( name, &d );
00999 if ( result == TIXML_SUCCESS ) {
01000 *_value = (float)d;
01001 }
01002 return result;
01003 }
01004
01005 #ifdef TIXML_USE_STL
01006
01014 template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const
01015 {
01016 const TiXmlAttribute* node = attributeSet.Find( name );
01017 if ( !node )
01018 return TIXML_NO_ATTRIBUTE;
01019
01020 std::stringstream sstream( node->ValueStr() );
01021 sstream >> *outValue;
01022 if ( !sstream.fail() )
01023 return TIXML_SUCCESS;
01024 return TIXML_WRONG_TYPE;
01025 }
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041 #endif
01042
01046 void SetAttribute( const char* name, const char * _value );
01047
01048 #ifdef TIXML_USE_STL
01049 const std::string* Attribute( const std::string& name ) const;
01050 const std::string* Attribute( const std::string& name, int* i ) const;
01051 const std::string* Attribute( const std::string& name, double* d ) const;
01052 int QueryIntAttribute( const std::string& name, int* _value ) const;
01053 int QueryDoubleAttribute( const std::string& name, double* _value ) const;
01054
01056 void SetAttribute( const std::string& name, const std::string& _value );
01058 void SetAttribute( const std::string& name, int _value );
01059 #endif
01060
01064 void SetAttribute( const char * name, int value );
01065
01069 void SetDoubleAttribute( const char * name, double value );
01070
01073 void RemoveAttribute( const char * name );
01074 #ifdef TIXML_USE_STL
01075 void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); }
01076 #endif
01077
01078 const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); }
01079 TiXmlAttribute* FirstAttribute() { return attributeSet.First(); }
01080 const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); }
01081 TiXmlAttribute* LastAttribute() { return attributeSet.Last(); }
01082
01115 const char* GetText() const;
01116
01118 virtual TiXmlNode* Clone() const;
01119
01120 virtual void Print( FILE* cfile, int depth ) const;
01121
01122
01123
01124
01125 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01126
01127 virtual const TiXmlElement* ToElement() const { return this; }
01128 virtual TiXmlElement* ToElement() { return this; }
01129
01132 virtual bool Accept( TiXmlVisitor* visitor ) const;
01133
01134 protected:
01135
01136 void CopyTo( TiXmlElement* target ) const;
01137 void ClearThis();
01138
01139
01140 #ifdef TIXML_USE_STL
01141 virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01142 #endif
01143
01144
01145
01146
01147 const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
01148
01149 private:
01150
01151 TiXmlAttributeSet attributeSet;
01152 };
01153
01154
01157 class TiXmlComment : public TiXmlNode
01158 {
01159 public:
01161 TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {}
01163 TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::COMMENT ) {
01164 SetValue( _value );
01165 }
01166 TiXmlComment( const TiXmlComment& );
01167 TiXmlComment& operator=( const TiXmlComment& base );
01168
01169 virtual ~TiXmlComment() {}
01170
01172 virtual TiXmlNode* Clone() const;
01173
01174 virtual void Print( FILE* cfile, int depth ) const;
01175
01176
01177
01178
01179 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01180
01181 virtual const TiXmlComment* ToComment() const { return this; }
01182 virtual TiXmlComment* ToComment() { return this; }
01183
01186 virtual bool Accept( TiXmlVisitor* visitor ) const;
01187
01188 protected:
01189 void CopyTo( TiXmlComment* target ) const;
01190
01191
01192 #ifdef TIXML_USE_STL
01193 virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01194 #endif
01195
01196
01197 private:
01198
01199 };
01200
01201
01207 class TiXmlText : public TiXmlNode
01208 {
01209 friend class TiXmlElement;
01210 public:
01215 TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT)
01216 {
01217 SetValue( initValue );
01218 cdata = false;
01219 }
01220 virtual ~TiXmlText() {}
01221
01222 #ifdef TIXML_USE_STL
01223
01224 TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
01225 {
01226 SetValue( initValue );
01227 cdata = false;
01228 }
01229 #endif
01230
01231 TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); }
01232 TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this;}
01233
01234
01235 virtual void Print( FILE* cfile, int depth ) const;
01236
01238 bool CDATA() const { return cdata; }
01240 void SetCDATA( bool _cdata ) { cdata = _cdata; }
01241
01242 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01243
01244 virtual const TiXmlText* ToText() const { return this; }
01245 virtual TiXmlText* ToText() { return this; }
01246
01249 virtual bool Accept( TiXmlVisitor* content ) const;
01250
01251 protected :
01253 virtual TiXmlNode* Clone() const;
01254 void CopyTo( TiXmlText* target ) const;
01255
01256 bool Blank() const;
01257
01258 #ifdef TIXML_USE_STL
01259 virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01260 #endif
01261
01262 private:
01263 bool cdata;
01264 };
01265
01266
01280 class TiXmlDeclaration : public TiXmlNode
01281 {
01282 public:
01284 TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {}
01285
01286 #ifdef TIXML_USE_STL
01287
01288 TiXmlDeclaration( const std::string& _version,
01289 const std::string& _encoding,
01290 const std::string& _standalone );
01291 #endif
01292
01294 TiXmlDeclaration( const char* _version,
01295 const char* _encoding,
01296 const char* _standalone );
01297
01298 TiXmlDeclaration( const TiXmlDeclaration& copy );
01299 TiXmlDeclaration& operator=( const TiXmlDeclaration& copy );
01300
01301 virtual ~TiXmlDeclaration() {}
01302
01304 const char *Version() const { return version.c_str (); }
01306 const char *Encoding() const { return encoding.c_str (); }
01308 const char *Standalone() const { return standalone.c_str (); }
01309
01311 virtual TiXmlNode* Clone() const;
01312
01313 virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
01314 virtual void Print( FILE* cfile, int depth ) const {
01315 Print( cfile, depth, 0 );
01316 }
01317
01318 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01319
01320 virtual const TiXmlDeclaration* ToDeclaration() const { return this; }
01321 virtual TiXmlDeclaration* ToDeclaration() { return this; }
01322
01325 virtual bool Accept( TiXmlVisitor* visitor ) const;
01326
01327 protected:
01328 void CopyTo( TiXmlDeclaration* target ) const;
01329
01330 #ifdef TIXML_USE_STL
01331 virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01332 #endif
01333
01334 private:
01335
01336 TIXML_STRING version;
01337 TIXML_STRING encoding;
01338 TIXML_STRING standalone;
01339 };
01340
01341
01349 class TiXmlUnknown : public TiXmlNode
01350 {
01351 public:
01352 TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {}
01353 virtual ~TiXmlUnknown() {}
01354
01355 TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); }
01356 TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this;}
01357
01359 virtual TiXmlNode* Clone() const;
01360
01361 virtual void Print( FILE* cfile, int depth ) const;
01362
01363 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01364
01365 virtual const TiXmlUnknown* ToUnknown() const { return this; }
01366 virtual TiXmlUnknown* ToUnknown() { return this; }
01367
01370 virtual bool Accept( TiXmlVisitor* content ) const;
01371
01372 protected:
01373 void CopyTo( TiXmlUnknown* target ) const;
01374
01375 #ifdef TIXML_USE_STL
01376 virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01377 #endif
01378
01379 private:
01380
01381 };
01382
01383
01388 class TiXmlDocument : public TiXmlNode
01389 {
01390 public:
01392 TiXmlDocument();
01394 TiXmlDocument( const char * documentName );
01395
01396 #ifdef TIXML_USE_STL
01397
01398 TiXmlDocument( const std::string& documentName );
01399 #endif
01400
01401 TiXmlDocument( const TiXmlDocument& copy );
01402 TiXmlDocument& operator=( const TiXmlDocument& copy );
01403
01404 virtual ~TiXmlDocument() {}
01405
01410 bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01412 bool SaveFile() const;
01414 bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01416 bool SaveFile( const char * filename ) const;
01422 bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01424 bool SaveFile( FILE* ) const;
01425
01426 #ifdef TIXML_USE_STL
01427 bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )
01428 {
01429
01430
01431 return LoadFile( filename.c_str(), encoding );
01432 }
01433 bool SaveFile( const std::string& filename ) const
01434 {
01435
01436
01437 return SaveFile( filename.c_str() );
01438 }
01439 #endif
01440
01445 virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01446
01451 const TiXmlElement* RootElement() const { return FirstChildElement(); }
01452 TiXmlElement* RootElement() { return FirstChildElement(); }
01453
01459 bool Error() const { return error; }
01460
01462 const char * ErrorDesc() const { return errorDesc.c_str (); }
01463
01467 int ErrorId() const { return errorId; }
01468
01476 int ErrorRow() const { return errorLocation.row+1; }
01477 int ErrorCol() const { return errorLocation.col+1; }
01478
01503 void SetTabSize( int _tabsize ) { tabsize = _tabsize; }
01504
01505 int TabSize() const { return tabsize; }
01506
01510 void ClearError() { error = false;
01511 errorId = 0;
01512 errorDesc = "";
01513 errorLocation.row = errorLocation.col = 0;
01514
01515 }
01516
01518 void Print() const { Print( stdout, 0 ); }
01519
01520
01521
01522
01523
01524
01525
01527 virtual void Print( FILE* cfile, int depth = 0 ) const;
01528
01529 void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
01530
01531 virtual const TiXmlDocument* ToDocument() const { return this; }
01532 virtual TiXmlDocument* ToDocument() { return this; }
01533
01536 virtual bool Accept( TiXmlVisitor* content ) const;
01537
01538 protected :
01539
01540 virtual TiXmlNode* Clone() const;
01541 #ifdef TIXML_USE_STL
01542 virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01543 #endif
01544
01545 private:
01546 void CopyTo( TiXmlDocument* target ) const;
01547
01548 bool error;
01549 int errorId;
01550 TIXML_STRING errorDesc;
01551 int tabsize;
01552 TiXmlCursor errorLocation;
01553 bool useMicrosoftBOM;
01554 };
01555
01556
01637 class TiXmlHandle
01638 {
01639 public:
01641 TiXmlHandle( TiXmlNode* _node ) { this->node = _node; }
01643 TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; }
01644 TiXmlHandle& operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; }
01645
01647 TiXmlHandle FirstChild() const;
01649 TiXmlHandle FirstChild( const char * value ) const;
01651 TiXmlHandle FirstChildElement() const;
01653 TiXmlHandle FirstChildElement( const char * value ) const;
01654
01658 TiXmlHandle Child( const char* value, int index ) const;
01662 TiXmlHandle Child( int index ) const;
01667 TiXmlHandle ChildElement( const char* value, int index ) const;
01672 TiXmlHandle ChildElement( int index ) const;
01673
01674 #ifdef TIXML_USE_STL
01675 TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); }
01676 TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); }
01677
01678 TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); }
01679 TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); }
01680 #endif
01681
01684 TiXmlNode* ToNode() const { return node; }
01687 TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
01690 TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
01693 TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
01694
01698 TiXmlNode* Node() const { return ToNode(); }
01702 TiXmlElement* Element() const { return ToElement(); }
01706 TiXmlText* Text() const { return ToText(); }
01710 TiXmlUnknown* Unknown() const { return ToUnknown(); }
01711
01712 private:
01713 TiXmlNode* node;
01714 };
01715
01716
01736 class TiXmlPrinter : public TiXmlVisitor
01737 {
01738 public:
01739 TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),
01740 buffer(), indent( " " ), lineBreak( "\n" ) {}
01741
01742 virtual bool VisitEnter( const TiXmlDocument& doc );
01743 virtual bool VisitExit( const TiXmlDocument& doc );
01744
01745 virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute );
01746 virtual bool VisitExit( const TiXmlElement& element );
01747
01748 virtual bool Visit( const TiXmlDeclaration& declaration );
01749 virtual bool Visit( const TiXmlText& text );
01750 virtual bool Visit( const TiXmlComment& comment );
01751 virtual bool Visit( const TiXmlUnknown& unknown );
01752
01756 void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; }
01758 const char* Indent() { return indent.c_str(); }
01763 void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; }
01765 const char* LineBreak() { return lineBreak.c_str(); }
01766
01770 void SetStreamPrinting() { indent = "";
01771 lineBreak = "";
01772 }
01774 const char* CStr() { return buffer.c_str(); }
01776 size_t Size() { return buffer.size(); }
01777
01778 #ifdef TIXML_USE_STL
01779
01780 const std::string& Str() { return buffer; }
01781 #endif
01782
01783 private:
01784 void DoIndent() {
01785 for( int i=0; i<depth; ++i )
01786 buffer += indent;
01787 }
01788 void DoLineBreak() {
01789 buffer += lineBreak;
01790 }
01791
01792 int depth;
01793 bool simpleTextPrint;
01794 TIXML_STRING buffer;
01795 TIXML_STRING indent;
01796 TIXML_STRING lineBreak;
01797 };
01798
01799
01800 #ifdef _MSC_VER
01801 #pragma warning( pop )
01802 #endif
01803
01804 #endif
01805