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 #ifndef TINYXML_INCLUDED
00027 #define TINYXML_INCLUDED
00028
00029 #ifdef _MSC_VER
00030 #pragma warning( push )
00031 #pragma warning( disable : 4530 )
00032 #pragma warning( disable : 4786 )
00033 #endif
00034
00035 #include <ctype.h>
00036 #include <stdio.h>
00037 #include <stdlib.h>
00038 #include <string.h>
00039 #include <assert.h>
00040
00041
00042 #if defined( _DEBUG ) && !defined( DEBUG )
00043 #define DEBUG
00044 #endif
00045
00046 #ifdef TIXML_USE_STL
00047 #include <string>
00048 #include <iostream>
00049 #define TIXML_STRING std::string
00050 #define TIXML_ISTREAM std::istream
00051 #define TIXML_OSTREAM std::ostream
00052 #else
00053 #include "tinystr.h"
00054 #define TIXML_STRING TiXmlString
00055 #define TIXML_OSTREAM TiXmlOutStream
00056 #endif
00057
00058
00059
00060
00061
00062
00063 #define TIXML_SAFE // TinyXml isn't fully buffer overrun protected, safe code. This is work in progress.
00064 #ifdef TIXML_SAFE
00065 #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
00066
00067 #define TIXML_SNPRINTF _snprintf_s
00068 #define TIXML_SNSCANF _snscanf_s
00069 #elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
00070
00071
00072 #define TIXML_SNPRINTF _snprintf
00073 #define TIXML_SNSCANF _snscanf
00074 #elif defined(__GNUC__) && (__GNUC__ >= 3 )
00075
00076
00077 #define TIXML_SNPRINTF snprintf
00078 #define TIXML_SNSCANF snscanf
00079 #endif
00080 #endif
00081
00082 class TiXmlDocument;
00083 class TiXmlElement;
00084 class TiXmlComment;
00085 class TiXmlUnknown;
00086 class TiXmlAttribute;
00087 class TiXmlText;
00088 class TiXmlDeclaration;
00089 class TiXmlParsingData;
00090
00091 const int TIXML_MAJOR_VERSION = 2;
00092 const int TIXML_MINOR_VERSION = 4;
00093 const int TIXML_PATCH_VERSION = 3;
00094
00095
00096
00097
00098 struct TiXmlCursor
00099 {
00100 TiXmlCursor() { Clear(); }
00101 void Clear() { row = col = -1; }
00102
00103 int row;
00104 int col;
00105 };
00106
00107
00108
00109 enum
00110 {
00111 TIXML_SUCCESS,
00112 TIXML_NO_ATTRIBUTE,
00113 TIXML_WRONG_TYPE
00114 };
00115
00116
00117
00118 enum TiXmlEncoding
00119 {
00120 TIXML_ENCODING_UNKNOWN,
00121 TIXML_ENCODING_UTF8,
00122 TIXML_ENCODING_LEGACY
00123 };
00124
00125 const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
00126
00149 class TiXmlBase
00150 {
00151 friend class TiXmlNode;
00152 friend class TiXmlElement;
00153 friend class TiXmlDocument;
00154
00155 public:
00156 TiXmlBase() : userData(0) {}
00157 virtual ~TiXmlBase() {}
00158
00164 virtual void Print( FILE* cfile, int depth ) const = 0;
00165
00172 static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; }
00173
00175 static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; }
00176
00195 int Row() const { return location.row + 1; }
00196 int Column() const { return location.col + 1; }
00197
00198 void SetUserData( void* user ) { userData = user; }
00199 void* GetUserData() { return userData; }
00200
00201
00202
00203 static const int utf8ByteTable[256];
00204
00205 virtual const char* Parse( const char* p,
00206 TiXmlParsingData* data,
00207 TiXmlEncoding encoding ) = 0;
00208
00209 enum
00210 {
00211 TIXML_NO_ERROR = 0,
00212 TIXML_ERROR,
00213 TIXML_ERROR_OPENING_FILE,
00214 TIXML_ERROR_OUT_OF_MEMORY,
00215 TIXML_ERROR_PARSING_ELEMENT,
00216 TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
00217 TIXML_ERROR_READING_ELEMENT_VALUE,
00218 TIXML_ERROR_READING_ATTRIBUTES,
00219 TIXML_ERROR_PARSING_EMPTY,
00220 TIXML_ERROR_READING_END_TAG,
00221 TIXML_ERROR_PARSING_UNKNOWN,
00222 TIXML_ERROR_PARSING_COMMENT,
00223 TIXML_ERROR_PARSING_DECLARATION,
00224 TIXML_ERROR_DOCUMENT_EMPTY,
00225 TIXML_ERROR_EMBEDDED_NULL,
00226 TIXML_ERROR_PARSING_CDATA,
00227
00228 TIXML_ERROR_STRING_COUNT
00229 };
00230
00231 protected:
00232
00233
00234
00235 class StringToBuffer
00236 {
00237 public:
00238 StringToBuffer( const TIXML_STRING& str );
00239 ~StringToBuffer();
00240 char* buffer;
00241 };
00242
00243 static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding );
00244 inline static bool IsWhiteSpace( char c )
00245 {
00246 return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' );
00247 }
00248 inline static bool IsWhiteSpace( int c )
00249 {
00250 if ( c < 256 )
00251 return IsWhiteSpace( (char) c );
00252 return false;
00253 }
00254
00255 virtual void StreamOut (TIXML_OSTREAM *) const = 0;
00256
00257 #ifdef TIXML_USE_STL
00258 static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag );
00259 static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag );
00260 #endif
00261
00262
00263
00264
00265
00266 static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
00267
00268
00269
00270
00271 static const char* ReadText( const char* in,
00272 TIXML_STRING* text,
00273 bool ignoreWhiteSpace,
00274 const char* endTag,
00275 bool ignoreCase,
00276 TiXmlEncoding encoding );
00277
00278
00279 static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );
00280
00281
00282
00283 inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )
00284 {
00285 assert( p );
00286 if ( encoding == TIXML_ENCODING_UTF8 )
00287 {
00288 *length = utf8ByteTable[ *((unsigned char*)p) ];
00289 assert( *length >= 0 && *length < 5 );
00290 }
00291 else
00292 {
00293 *length = 1;
00294 }
00295
00296 if ( *length == 1 )
00297 {
00298 if ( *p == '&' )
00299 return GetEntity( p, _value, length, encoding );
00300 *_value = *p;
00301 return p+1;
00302 }
00303 else if ( *length )
00304 {
00305
00306
00307 for( int i=0; p[i] && i<*length; ++i ) {
00308 _value[i] = p[i];
00309 }
00310 return p + (*length);
00311 }
00312 else
00313 {
00314
00315 return 0;
00316 }
00317 }
00318
00319
00320
00321 static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out );
00322
00323 static void PutString( const TIXML_STRING& str, TIXML_STRING* out );
00324
00325
00326
00327
00328 static bool StringEqual( const char* p,
00329 const char* endTag,
00330 bool ignoreCase,
00331 TiXmlEncoding encoding );
00332
00333 static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
00334
00335 TiXmlCursor location;
00336
00338 void* userData;
00339
00340
00341
00342 static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );
00343 static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );
00344 inline static int ToLower( int v, TiXmlEncoding encoding )
00345 {
00346 if ( encoding == TIXML_ENCODING_UTF8 )
00347 {
00348 if ( v < 128 ) return tolower( v );
00349 return v;
00350 }
00351 else
00352 {
00353 return tolower( v );
00354 }
00355 }
00356 static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
00357
00358 private:
00359 TiXmlBase( const TiXmlBase& );
00360 void operator=( const TiXmlBase& base );
00361
00362 struct Entity
00363 {
00364 const char* str;
00365 unsigned int strLength;
00366 char chr;
00367 };
00368 enum
00369 {
00370 NUM_ENTITY = 5,
00371 MAX_ENTITY_LENGTH = 6
00372
00373 };
00374 static Entity entity[ NUM_ENTITY ];
00375 static bool condenseWhiteSpace;
00376 };
00377
00378
00385 class TiXmlNode : public TiXmlBase
00386 {
00387 friend class TiXmlDocument;
00388 friend class TiXmlElement;
00389
00390 public:
00391 #ifdef TIXML_USE_STL
00392
00396 friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
00397
00414 friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);
00415
00417 friend std::string& operator<< (std::string& out, const TiXmlNode& base );
00418
00419 #else
00420
00421 friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base);
00422 #endif
00423
00427 enum NodeType
00428 {
00429 DOCUMENT,
00430 ELEMENT,
00431 COMMENT,
00432 UNKNOWN,
00433 TEXT,
00434 DECLARATION,
00435 TYPECOUNT
00436 };
00437
00438 virtual ~TiXmlNode();
00439
00452 const char *Value() const { return value.c_str (); }
00453
00454 #ifdef TIXML_USE_STL
00455
00459 const std::string& ValueStr() const { return value; }
00460 #endif
00461
00471 void SetValue(const char * _value) { value = _value;}
00472
00473 #ifdef TIXML_USE_STL
00474
00475 void SetValue( const std::string& _value ) { value = _value; }
00476 #endif
00477
00479 void Clear();
00480
00482 TiXmlNode* Parent() { return parent; }
00483 const TiXmlNode* Parent() const { return parent; }
00484
00485 const TiXmlNode* FirstChild() const { return firstChild; }
00486 TiXmlNode* FirstChild() { return firstChild; }
00487 const TiXmlNode* FirstChild( const char * value ) const;
00488 TiXmlNode* FirstChild( const char * value );
00489
00490 const TiXmlNode* LastChild() const { return lastChild; }
00491 TiXmlNode* LastChild() { return lastChild; }
00492 const TiXmlNode* LastChild( const char * value ) const;
00493 TiXmlNode* LastChild( const char * value );
00494
00495 #ifdef TIXML_USE_STL
00496 const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); }
00497 TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); }
00498 const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); }
00499 TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); }
00500 #endif
00501
00518 const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const;
00519 TiXmlNode* IterateChildren( TiXmlNode* previous );
00520
00522 const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const;
00523 TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous );
00524
00525 #ifdef TIXML_USE_STL
00526 const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); }
00527 TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); }
00528 #endif
00529
00533 TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
00534
00535
00545 TiXmlNode* LinkEndChild( TiXmlNode* addThis );
00546
00550 TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
00551
00555 TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
00556
00560 TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
00561
00563 bool RemoveChild( TiXmlNode* removeThis );
00564
00566 const TiXmlNode* PreviousSibling() const { return prev; }
00567 TiXmlNode* PreviousSibling() { return prev; }
00568
00570 const TiXmlNode* PreviousSibling( const char * ) const;
00571 TiXmlNode* PreviousSibling( const char * );
00572
00573 #ifdef TIXML_USE_STL
00574 const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); }
00575 TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); }
00576 const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); }
00577 TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); }
00578 #endif
00579
00581 const TiXmlNode* NextSibling() const { return next; }
00582 TiXmlNode* NextSibling() { return next; }
00583
00585 const TiXmlNode* NextSibling( const char * ) const;
00586 TiXmlNode* NextSibling( const char * );
00587
00592 const TiXmlElement* NextSiblingElement() const;
00593 TiXmlElement* NextSiblingElement();
00594
00599 const TiXmlElement* NextSiblingElement( const char * ) const;
00600 TiXmlElement* NextSiblingElement( const char * );
00601
00602 #ifdef TIXML_USE_STL
00603 const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); }
00604 TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); }
00605 #endif
00606
00608 const TiXmlElement* FirstChildElement() const;
00609 TiXmlElement* FirstChildElement();
00610
00612 const TiXmlElement* FirstChildElement( const char * value ) const;
00613 TiXmlElement* FirstChildElement( const char * value );
00614
00615 #ifdef TIXML_USE_STL
00616 const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); }
00617 TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); }
00618 #endif
00619
00624 int Type() const { return type; }
00625
00629 const TiXmlDocument* GetDocument() const;
00630 TiXmlDocument* GetDocument();
00631
00633 bool NoChildren() const { return !firstChild; }
00634
00635 virtual const TiXmlDocument* ToDocument() const { return 0; }
00636 virtual const TiXmlElement* ToElement() const { return 0; }
00637 virtual const TiXmlComment* ToComment() const { return 0; }
00638 virtual const TiXmlUnknown* ToUnknown() const { return 0; }
00639 virtual const TiXmlText* ToText() const { return 0; }
00640 virtual const TiXmlDeclaration* ToDeclaration() const { return 0; }
00641
00642 virtual TiXmlDocument* ToDocument() { return 0; }
00643 virtual TiXmlElement* ToElement() { return 0; }
00644 virtual TiXmlComment* ToComment() { return 0; }
00645 virtual TiXmlUnknown* ToUnknown() { return 0; }
00646 virtual TiXmlText* ToText() { return 0; }
00647 virtual TiXmlDeclaration* ToDeclaration() { return 0; }
00648
00652 virtual TiXmlNode* Clone() const = 0;
00653
00654 protected:
00655 TiXmlNode( NodeType _type );
00656
00657
00658
00659 void CopyTo( TiXmlNode* target ) const;
00660
00661 #ifdef TIXML_USE_STL
00662
00663 virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0;
00664 #endif
00665
00666
00667 TiXmlNode* Identify( const char* start, TiXmlEncoding encoding );
00668
00669 TiXmlNode* parent;
00670 NodeType type;
00671
00672 TiXmlNode* firstChild;
00673 TiXmlNode* lastChild;
00674
00675 TIXML_STRING value;
00676
00677 TiXmlNode* prev;
00678 TiXmlNode* next;
00679
00680 private:
00681 TiXmlNode( const TiXmlNode& );
00682 void operator=( const TiXmlNode& base );
00683 };
00684
00685
00693 class TiXmlAttribute : public TiXmlBase
00694 {
00695 friend class TiXmlAttributeSet;
00696
00697 public:
00699 TiXmlAttribute() : TiXmlBase()
00700 {
00701 document = 0;
00702 prev = next = 0;
00703 }
00704
00705 #ifdef TIXML_USE_STL
00706
00707 TiXmlAttribute( const std::string& _name, const std::string& _value )
00708 {
00709 name = _name;
00710 value = _value;
00711 document = 0;
00712 prev = next = 0;
00713 }
00714 #endif
00715
00717 TiXmlAttribute( const char * _name, const char * _value )
00718 {
00719 name = _name;
00720 value = _value;
00721 document = 0;
00722 prev = next = 0;
00723 }
00724
00725 const char* Name() const { return name.c_str (); }
00726 const char* Value() const { return value.c_str (); }
00727 int IntValue() const;
00728 double DoubleValue() const;
00729
00730
00731 const TIXML_STRING& NameTStr() const { return name; }
00732
00742 int QueryIntValue( int* _value ) const;
00744 int QueryDoubleValue( double* _value ) const;
00745
00746 void SetName( const char* _name ) { name = _name; }
00747 void SetValue( const char* _value ) { value = _value; }
00748
00749 void SetIntValue( int _value );
00750 void SetDoubleValue( double _value );
00751
00752 #ifdef TIXML_USE_STL
00753
00754 void SetName( const std::string& _name ) { name = _name; }
00756 void SetValue( const std::string& _value ) { value = _value; }
00757 #endif
00758
00760 const TiXmlAttribute* Next() const;
00761 TiXmlAttribute* Next();
00763 const TiXmlAttribute* Previous() const;
00764 TiXmlAttribute* Previous();
00765
00766 bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
00767 bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; }
00768 bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; }
00769
00770
00771
00772
00773 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
00774
00775
00776 virtual void Print( FILE* cfile, int depth ) const;
00777
00778 virtual void StreamOut( TIXML_OSTREAM * out ) const;
00779
00780
00781 void SetDocument( TiXmlDocument* doc ) { document = doc; }
00782
00783 private:
00784 TiXmlAttribute( const TiXmlAttribute& );
00785 void operator=( const TiXmlAttribute& base );
00786
00787 TiXmlDocument* document;
00788 TIXML_STRING name;
00789 TIXML_STRING value;
00790 TiXmlAttribute* prev;
00791 TiXmlAttribute* next;
00792 };
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807 class TiXmlAttributeSet
00808 {
00809 public:
00810 TiXmlAttributeSet();
00811 ~TiXmlAttributeSet();
00812
00813 void Add( TiXmlAttribute* attribute );
00814 void Remove( TiXmlAttribute* attribute );
00815
00816 const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
00817 TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
00818 const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
00819 TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
00820
00821 const TiXmlAttribute* Find( const TIXML_STRING& name ) const;
00822 TiXmlAttribute* Find( const TIXML_STRING& name );
00823
00824 private:
00825
00826
00827 TiXmlAttributeSet( const TiXmlAttributeSet& );
00828 void operator=( const TiXmlAttributeSet& );
00829
00830 TiXmlAttribute sentinel;
00831 };
00832
00833
00838 class TiXmlElement : public TiXmlNode
00839 {
00840 public:
00842 TiXmlElement (const char * in_value);
00843
00844 #ifdef TIXML_USE_STL
00845
00846 TiXmlElement( const std::string& _value );
00847 #endif
00848
00849 TiXmlElement( const TiXmlElement& );
00850
00851 void operator=( const TiXmlElement& base );
00852
00853 virtual ~TiXmlElement();
00854
00858 const char* Attribute( const char* name ) const;
00859
00866 const char* Attribute( const char* name, int* i ) const;
00867
00874 const char* Attribute( const char* name, double* d ) const;
00875
00883 int QueryIntAttribute( const char* name, int* _value ) const;
00885 int QueryDoubleAttribute( const char* name, double* _value ) const;
00887 int QueryFloatAttribute( const char* name, float* _value ) const {
00888 double d;
00889 int result = QueryDoubleAttribute( name, &d );
00890 if ( result == TIXML_SUCCESS ) {
00891 *_value = (float)d;
00892 }
00893 return result;
00894 }
00895
00899 void SetAttribute( const char* name, const char * _value );
00900
00901 #ifdef TIXML_USE_STL
00902 const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); }
00903 const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); }
00904 const char* Attribute( const std::string& name, double* d ) const { return Attribute( name.c_str(), d ); }
00905 int QueryIntAttribute( const std::string& name, int* _value ) const { return QueryIntAttribute( name.c_str(), _value ); }
00906 int QueryDoubleAttribute( const std::string& name, double* _value ) const { return QueryDoubleAttribute( name.c_str(), _value ); }
00907
00909 void SetAttribute( const std::string& name, const std::string& _value );
00911 void SetAttribute( const std::string& name, int _value );
00912 #endif
00913
00917 void SetAttribute( const char * name, int value );
00918
00922 void SetDoubleAttribute( const char * name, double value );
00923
00926 void RemoveAttribute( const char * name );
00927 #ifdef TIXML_USE_STL
00928 void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); }
00929 #endif
00930
00931 const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); }
00932 TiXmlAttribute* FirstAttribute() { return attributeSet.First(); }
00933 const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); }
00934 TiXmlAttribute* LastAttribute() { return attributeSet.Last(); }
00935
00968 const char* GetText() const;
00969
00971 virtual TiXmlNode* Clone() const;
00972
00973 virtual void Print( FILE* cfile, int depth ) const;
00974
00975
00976
00977
00978 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
00979
00980 virtual const TiXmlElement* ToElement() const { return this; }
00981 virtual TiXmlElement* ToElement() { return this; }
00982
00983 protected:
00984
00985 void CopyTo( TiXmlElement* target ) const;
00986 void ClearThis();
00987
00988
00989 #ifdef TIXML_USE_STL
00990 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
00991 #endif
00992 virtual void StreamOut( TIXML_OSTREAM * out ) const;
00993
00994
00995
00996
00997
00998 const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
00999
01000 private:
01001
01002 TiXmlAttributeSet attributeSet;
01003 };
01004
01005
01008 class TiXmlComment : public TiXmlNode
01009 {
01010 public:
01012 TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {}
01013 TiXmlComment( const TiXmlComment& );
01014 void operator=( const TiXmlComment& base );
01015
01016 virtual ~TiXmlComment() {}
01017
01019 virtual TiXmlNode* Clone() const;
01021 virtual void Print( FILE* cfile, int depth ) const;
01022
01023
01024
01025
01026 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01027
01028 virtual const TiXmlComment* ToComment() const { return this; }
01029 virtual TiXmlComment* ToComment() { return this; }
01030
01031 protected:
01032 void CopyTo( TiXmlComment* target ) const;
01033
01034
01035 #ifdef TIXML_USE_STL
01036 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
01037 #endif
01038 virtual void StreamOut( TIXML_OSTREAM * out ) const;
01039
01040 private:
01041
01042 };
01043
01044
01050 class TiXmlText : public TiXmlNode
01051 {
01052 friend class TiXmlElement;
01053 public:
01058 TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT)
01059 {
01060 SetValue( initValue );
01061 cdata = false;
01062 }
01063 virtual ~TiXmlText() {}
01064
01065 #ifdef TIXML_USE_STL
01066
01067 TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
01068 {
01069 SetValue( initValue );
01070 cdata = false;
01071 }
01072 #endif
01073
01074 TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); }
01075 void operator=( const TiXmlText& base ) { base.CopyTo( this ); }
01076
01078 virtual void Print( FILE* cfile, int depth ) const;
01079
01081 bool CDATA() { return cdata; }
01083 void SetCDATA( bool _cdata ) { cdata = _cdata; }
01084
01085 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01086
01087 virtual const TiXmlText* ToText() const { return this; }
01088 virtual TiXmlText* ToText() { return this; }
01089
01090 protected :
01092 virtual TiXmlNode* Clone() const;
01093 void CopyTo( TiXmlText* target ) const;
01094
01095 virtual void StreamOut ( TIXML_OSTREAM * out ) const;
01096 bool Blank() const;
01097
01098 #ifdef TIXML_USE_STL
01099 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
01100 #endif
01101
01102 private:
01103 bool cdata;
01104 };
01105
01106
01120 class TiXmlDeclaration : public TiXmlNode
01121 {
01122 public:
01124 TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {}
01125
01126 #ifdef TIXML_USE_STL
01127
01128 TiXmlDeclaration( const std::string& _version,
01129 const std::string& _encoding,
01130 const std::string& _standalone );
01131 #endif
01132
01134 TiXmlDeclaration( const char* _version,
01135 const char* _encoding,
01136 const char* _standalone );
01137
01138 TiXmlDeclaration( const TiXmlDeclaration& copy );
01139 void operator=( const TiXmlDeclaration& copy );
01140
01141 virtual ~TiXmlDeclaration() {}
01142
01144 const char *Version() const { return version.c_str (); }
01146 const char *Encoding() const { return encoding.c_str (); }
01148 const char *Standalone() const { return standalone.c_str (); }
01149
01151 virtual TiXmlNode* Clone() const;
01153 virtual void Print( FILE* cfile, int depth ) const;
01154
01155 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01156
01157 virtual const TiXmlDeclaration* ToDeclaration() const { return this; }
01158 virtual TiXmlDeclaration* ToDeclaration() { return this; }
01159
01160 protected:
01161 void CopyTo( TiXmlDeclaration* target ) const;
01162
01163 #ifdef TIXML_USE_STL
01164 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
01165 #endif
01166 virtual void StreamOut ( TIXML_OSTREAM * out) const;
01167
01168 private:
01169
01170 TIXML_STRING version;
01171 TIXML_STRING encoding;
01172 TIXML_STRING standalone;
01173 };
01174
01175
01183 class TiXmlUnknown : public TiXmlNode
01184 {
01185 public:
01186 TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {}
01187 virtual ~TiXmlUnknown() {}
01188
01189 TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); }
01190 void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); }
01191
01193 virtual TiXmlNode* Clone() const;
01195 virtual void Print( FILE* cfile, int depth ) const;
01196
01197 virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01198
01199 virtual const TiXmlUnknown* ToUnknown() const { return this; }
01200 virtual TiXmlUnknown* ToUnknown() { return this; }
01201
01202 protected:
01203 void CopyTo( TiXmlUnknown* target ) const;
01204
01205 #ifdef TIXML_USE_STL
01206 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
01207 #endif
01208 virtual void StreamOut ( TIXML_OSTREAM * out ) const;
01209
01210 private:
01211
01212 };
01213
01214
01219 class TiXmlDocument : public TiXmlNode
01220 {
01221 public:
01223 TiXmlDocument();
01225 TiXmlDocument( const char * documentName );
01226
01227 #ifdef TIXML_USE_STL
01228
01229 TiXmlDocument( const std::string& documentName );
01230 #endif
01231
01232 TiXmlDocument( const TiXmlDocument& copy );
01233 void operator=( const TiXmlDocument& copy );
01234
01235 virtual ~TiXmlDocument() {}
01236
01241 bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01243 bool SaveFile() const;
01245 bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01247 bool SaveFile( const char * filename ) const;
01253 bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01255 bool SaveFile( FILE* ) const;
01256
01257 #ifdef TIXML_USE_STL
01258 bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )
01259 {
01260 StringToBuffer f( filename );
01261 return ( f.buffer && LoadFile( f.buffer, encoding ));
01262 }
01263 bool SaveFile( const std::string& filename ) const
01264 {
01265 StringToBuffer f( filename );
01266 return ( f.buffer && SaveFile( f.buffer ));
01267 }
01268 #endif
01269
01274 virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01275
01280 const TiXmlElement* RootElement() const { return FirstChildElement(); }
01281 TiXmlElement* RootElement() { return FirstChildElement(); }
01282
01288 bool Error() const { return error; }
01289
01291 const char * ErrorDesc() const { return errorDesc.c_str (); }
01292
01296 int ErrorId() const { return errorId; }
01297
01305 int ErrorRow() { return errorLocation.row+1; }
01306 int ErrorCol() { return errorLocation.col+1; }
01307
01332 void SetTabSize( int _tabsize ) { tabsize = _tabsize; }
01333
01334 int TabSize() const { return tabsize; }
01335
01339 void ClearError() { error = false;
01340 errorId = 0;
01341 errorDesc = "";
01342 errorLocation.row = errorLocation.col = 0;
01343
01344 }
01345
01347 void Print() const { Print( stdout, 0 ); }
01348
01350 virtual void Print( FILE* cfile, int depth = 0 ) const;
01351
01352 void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
01353
01354 virtual const TiXmlDocument* ToDocument() const { return this; }
01355 virtual TiXmlDocument* ToDocument() { return this; }
01356
01357 protected :
01358 virtual void StreamOut ( TIXML_OSTREAM * out) const;
01359
01360 virtual TiXmlNode* Clone() const;
01361 #ifdef TIXML_USE_STL
01362 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
01363 #endif
01364
01365 private:
01366 void CopyTo( TiXmlDocument* target ) const;
01367
01368 bool error;
01369 int errorId;
01370 TIXML_STRING errorDesc;
01371 int tabsize;
01372 TiXmlCursor errorLocation;
01373 bool useMicrosoftBOM;
01374 };
01375
01376
01457 class TiXmlHandle
01458 {
01459 public:
01461 TiXmlHandle( TiXmlNode* _node ) { this->node = _node; }
01463 TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; }
01464 TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; }
01465
01467 TiXmlHandle FirstChild() const;
01469 TiXmlHandle FirstChild( const char * value ) const;
01471 TiXmlHandle FirstChildElement() const;
01473 TiXmlHandle FirstChildElement( const char * value ) const;
01474
01478 TiXmlHandle Child( const char* value, int index ) const;
01482 TiXmlHandle Child( int index ) const;
01487 TiXmlHandle ChildElement( const char* value, int index ) const;
01492 TiXmlHandle ChildElement( int index ) const;
01493
01494 #ifdef TIXML_USE_STL
01495 TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); }
01496 TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); }
01497
01498 TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); }
01499 TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); }
01500 #endif
01501
01503 TiXmlNode* Node() const { return node; }
01505 TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
01507 TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
01509 TiXmlUnknown* Unknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
01510
01511 private:
01512 TiXmlNode* node;
01513 };
01514
01515 #ifdef _MSC_VER
01516 #pragma warning( pop )
01517 #endif
01518
01519 #endif
01520