24 #ifndef TINYXML2_INCLUDED
25 #define TINYXML2_INCLUDED
27 #if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__)
56 #if defined( _DEBUG ) || defined (__DEBUG__)
57 # ifndef TINYXML2_DEBUG
58 # define TINYXML2_DEBUG
63 # pragma warning(push)
64 # pragma warning(disable: 4251)
68 # ifdef TINYXML2_EXPORT
69 # define TINYXML2_LIB __declspec(dllexport)
70 # elif defined(TINYXML2_IMPORT)
71 # define TINYXML2_LIB __declspec(dllimport)
76 # define TINYXML2_LIB __attribute__((visibility("default")))
82 #if defined(TINYXML2_DEBUG)
83 # if defined(_MSC_VER)
84 # // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like
85 # define TIXMLASSERT( x ) if ( !((void)0,(x))) { __debugbreak(); }
86 # elif defined (ANDROID_NDK)
87 # include <android/log.h>
88 # define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); }
91 # define TIXMLASSERT assert
94 # define TIXMLASSERT( x ) {}
101 static const int TIXML2_MAJOR_VERSION = 6;
102 static const int TIXML2_MINOR_VERSION = 2;
103 static const int TIXML2_PATCH_VERSION = 0;
105 #define TINYXML2_MAJOR_VERSION 6
106 #define TINYXML2_MINOR_VERSION 2
107 #define TINYXML2_PATCH_VERSION 0
114 static const int TINYXML2_MAX_ELEMENT_DEPTH = 100;
123 class XMLDeclaration;
137 NEEDS_ENTITY_PROCESSING = 0x01,
138 NEEDS_NEWLINE_NORMALIZATION = 0x02,
139 NEEDS_WHITESPACE_COLLAPSING = 0x04,
141 TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION,
142 TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION,
144 ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION,
145 ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION,
146 COMMENT = NEEDS_NEWLINE_NORMALIZATION
149 StrPair() : _flags( 0 ), _start( 0 ), _end( 0 ) {}
152 void Set(
char* start,
char* end,
int flags ) {
153 TIXMLASSERT( start );
158 _flags = flags | NEEDS_FLUSH;
161 const char* GetStr();
164 return _start == _end;
167 void SetInternedStr(
const char* str ) {
169 _start =
const_cast<char*
>(str);
172 void SetStr(
const char* str,
int flags=0 );
174 char* ParseText(
char* in,
const char* endTag,
int strFlags,
int* curLineNumPtr );
175 char* ParseName(
char* in );
177 void TransferTo( StrPair* other );
181 void CollapseWhitespace();
192 StrPair(
const StrPair& other );
193 void operator=( StrPair& other );
202 template <
class T,
int INITIAL_SIZE>
208 _allocated( INITIAL_SIZE ),
214 if ( _mem != _pool ) {
224 TIXMLASSERT( _size < INT_MAX );
225 EnsureCapacity( _size+1 );
230 T* PushArr(
int count ) {
231 TIXMLASSERT( count >= 0 );
232 TIXMLASSERT( _size <= INT_MAX - count );
233 EnsureCapacity( _size+count );
234 T* ret = &_mem[_size];
240 TIXMLASSERT( _size > 0 );
245 void PopArr(
int count ) {
246 TIXMLASSERT( _size >= count );
254 T& operator[](
int i) {
255 TIXMLASSERT( i>= 0 && i < _size );
259 const T& operator[](
int i)
const {
260 TIXMLASSERT( i>= 0 && i < _size );
264 const T& PeekTop()
const {
265 TIXMLASSERT( _size > 0 );
266 return _mem[ _size - 1];
270 TIXMLASSERT( _size >= 0 );
274 int Capacity()
const {
275 TIXMLASSERT( _allocated >= INITIAL_SIZE );
279 void SwapRemove(
int i) {
280 TIXMLASSERT(i >= 0 && i < _size);
281 TIXMLASSERT(_size > 0);
282 _mem[i] = _mem[_size - 1];
286 const T* Mem()
const {
297 DynArray(
const DynArray& );
298 void operator=(
const DynArray& );
300 void EnsureCapacity(
int cap ) {
301 TIXMLASSERT( cap > 0 );
302 if ( cap > _allocated ) {
303 TIXMLASSERT( cap <= INT_MAX / 2 );
304 int newAllocated = cap * 2;
305 T* newMem =
new T[newAllocated];
306 TIXMLASSERT( newAllocated >= _size );
307 memcpy( newMem, _mem,
sizeof(T)*_size );
308 if ( _mem != _pool ) {
312 _allocated = newAllocated;
317 T _pool[INITIAL_SIZE];
331 virtual ~MemPool() {}
333 virtual int ItemSize()
const = 0;
334 virtual void* Alloc() = 0;
335 virtual void Free(
void* ) = 0;
336 virtual void SetTracked() = 0;
337 virtual void Clear() = 0;
344 template<
int ITEM_SIZE >
345 class MemPoolT :
public MemPool
348 MemPoolT() : _blockPtrs(), _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {}
355 while( !_blockPtrs.Empty()) {
356 Block* lastBlock = _blockPtrs.Pop();
366 virtual int ItemSize()
const {
369 int CurrentAllocs()
const {
370 return _currentAllocs;
373 virtual void* Alloc() {
376 Block* block =
new Block();
377 _blockPtrs.Push( block );
379 Item* blockItems = block->items;
380 for(
int i = 0; i < ITEMS_PER_BLOCK - 1; ++i ) {
381 blockItems[i].next = &(blockItems[i + 1]);
383 blockItems[ITEMS_PER_BLOCK - 1].next = 0;
386 Item*
const result = _root;
387 TIXMLASSERT( result != 0 );
391 if ( _currentAllocs > _maxAllocs ) {
392 _maxAllocs = _currentAllocs;
399 virtual void Free(
void* mem ) {
404 Item* item =
static_cast<Item*
>( mem );
405 #ifdef TINYXML2_DEBUG
406 memset( item, 0xfe,
sizeof( *item ) );
411 void Trace(
const char* name ) {
412 printf(
"Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n",
413 name, _maxAllocs, _maxAllocs * ITEM_SIZE / 1024, _currentAllocs,
414 ITEM_SIZE, _nAllocs, _blockPtrs.Size() );
421 int Untracked()
const {
436 enum { ITEMS_PER_BLOCK = (4 * 1024) / ITEM_SIZE };
439 MemPoolT(
const MemPoolT& );
440 void operator=(
const MemPoolT& );
444 char itemData[ITEM_SIZE];
447 Item items[ITEMS_PER_BLOCK];
449 DynArray< Block*, 10 > _blockPtrs;
524 XML_WRONG_ATTRIBUTE_TYPE,
525 XML_ERROR_FILE_NOT_FOUND,
526 XML_ERROR_FILE_COULD_NOT_BE_OPENED,
527 XML_ERROR_FILE_READ_ERROR,
528 UNUSED_XML_ERROR_ELEMENT_MISMATCH,
529 XML_ERROR_PARSING_ELEMENT,
530 XML_ERROR_PARSING_ATTRIBUTE,
531 UNUSED_XML_ERROR_IDENTIFYING_TAG,
532 XML_ERROR_PARSING_TEXT,
533 XML_ERROR_PARSING_CDATA,
534 XML_ERROR_PARSING_COMMENT,
535 XML_ERROR_PARSING_DECLARATION,
536 XML_ERROR_PARSING_UNKNOWN,
537 XML_ERROR_EMPTY_DOCUMENT,
538 XML_ERROR_MISMATCHED_ELEMENT,
540 XML_CAN_NOT_CONVERT_TEXT,
542 XML_ELEMENT_DEPTH_EXCEEDED,
551 class TINYXML2_LIB XMLUtil
554 static const char* SkipWhiteSpace(
const char* p,
int* curLineNumPtr ) {
557 while( IsWhiteSpace(*p) ) {
558 if (curLineNumPtr && *p ==
'\n') {
566 static char* SkipWhiteSpace(
char* p,
int* curLineNumPtr ) {
567 return const_cast<char*
>( SkipWhiteSpace(
const_cast<const char*
>(p), curLineNumPtr ) );
572 static bool IsWhiteSpace(
char p ) {
573 return !IsUTF8Continuation(p) && isspace(
static_cast<unsigned char>(p) );
576 inline static bool IsNameStartChar(
unsigned char ch ) {
581 if ( isalpha( ch ) ) {
584 return ch ==
':' || ch ==
'_';
587 inline static bool IsNameChar(
unsigned char ch ) {
588 return IsNameStartChar( ch )
594 inline static bool StringEqual(
const char* p,
const char* q,
int nChar=INT_MAX ) {
600 TIXMLASSERT( nChar >= 0 );
601 return strncmp( p, q, nChar ) == 0;
604 inline static bool IsUTF8Continuation(
char p ) {
605 return ( p & 0x80 ) != 0;
608 static const char* ReadBOM(
const char* p,
bool* hasBOM );
611 static const char* GetCharacterRef(
const char* p,
char* value,
int* length );
612 static void ConvertUTF32ToUTF8(
unsigned long input,
char* output,
int* length );
615 static void ToStr(
int v,
char* buffer,
int bufferSize );
616 static void ToStr(
unsigned v,
char* buffer,
int bufferSize );
617 static void ToStr(
bool v,
char* buffer,
int bufferSize );
618 static void ToStr(
float v,
char* buffer,
int bufferSize );
619 static void ToStr(
double v,
char* buffer,
int bufferSize );
620 static void ToStr(int64_t v,
char* buffer,
int bufferSize);
623 static bool ToInt(
const char* str,
int* value );
624 static bool ToUnsigned(
const char* str,
unsigned* value );
625 static bool ToBool(
const char* str,
bool* value );
626 static bool ToFloat(
const char* str,
float* value );
627 static bool ToDouble(
const char* str,
double* value );
628 static bool ToInt64(
const char* str, int64_t* value);
635 static void SetBoolSerialization(
const char* writeTrue,
const char* writeFalse);
638 static const char* writeBoolTrue;
639 static const char* writeBoolFalse;
676 TIXMLASSERT( _document );
681 TIXMLASSERT( _document );
713 virtual const XMLText* ToText()
const {
716 virtual const XMLComment* ToComment()
const {
719 virtual const XMLDocument* ToDocument()
const {
722 virtual const XMLDeclaration* ToDeclaration()
const {
725 virtual const XMLUnknown* ToUnknown()
const {
738 const char* Value()
const;
743 void SetValue(
const char* val,
bool staticMem=
false );
774 const XMLElement* FirstChildElement(
const char* name = 0 )
const;
776 XMLElement* FirstChildElement(
const char* name = 0 ) {
777 return const_cast<XMLElement*
>(
const_cast<const XMLNode*
>(
this)->FirstChildElement( name ));
792 const XMLElement* LastChildElement(
const char* name = 0 )
const;
794 XMLElement* LastChildElement(
const char* name = 0 ) {
795 return const_cast<XMLElement*
>(
const_cast<const XMLNode*
>(
this)->LastChildElement(name) );
808 const XMLElement* PreviousSiblingElement(
const char* name = 0 )
const ;
810 XMLElement* PreviousSiblingElement(
const char* name = 0 ) {
811 return const_cast<XMLElement*
>(
const_cast<const XMLNode*
>(
this)->PreviousSiblingElement( name ) );
824 const XMLElement* NextSiblingElement(
const char* name = 0 )
const;
826 XMLElement* NextSiblingElement(
const char* name = 0 ) {
827 return const_cast<XMLElement*
>(
const_cast<const XMLNode*
>(
this)->NextSiblingElement( name ) );
837 XMLNode* InsertEndChild( XMLNode* addThis );
839 XMLNode* LinkEndChild( XMLNode* addThis ) {
840 return InsertEndChild( addThis );
849 XMLNode* InsertFirstChild( XMLNode* addThis );
858 XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis );
863 void DeleteChildren();
868 void DeleteChild( XMLNode* node );
879 virtual XMLNode* ShallowClone( XMLDocument* document )
const = 0;
894 XMLNode* DeepClone( XMLDocument* target )
const;
902 virtual bool ShallowEqual(
const XMLNode* compare )
const = 0;
926 virtual bool Accept( XMLVisitor* visitor )
const = 0;
946 virtual char* ParseDeep(
char* p, StrPair* parentEndTag,
int* curLineNumPtr);
950 mutable StrPair _value;
964 static void DeleteNode(
XMLNode* node );
965 void InsertChildPreamble(
XMLNode* insertThis )
const;
966 const XMLElement* ToElementWithName(
const char* name )
const;
989 virtual bool Accept(
XMLVisitor* visitor )
const;
994 virtual const XMLText* ToText()
const {
1008 virtual bool ShallowEqual(
const XMLNode* compare )
const;
1012 virtual ~XMLText() {}
1014 char* ParseDeep(
char* p, StrPair* parentEndTag,
int* curLineNumPtr );
1019 XMLText(
const XMLText& );
1020 XMLText& operator=(
const XMLText& );
1032 virtual const XMLComment* ToComment()
const {
1036 virtual bool Accept( XMLVisitor* visitor )
const;
1038 virtual XMLNode* ShallowClone( XMLDocument* document )
const;
1039 virtual bool ShallowEqual(
const XMLNode* compare )
const;
1042 XMLComment( XMLDocument* doc );
1043 virtual ~XMLComment();
1045 char* ParseDeep(
char* p, StrPair* parentEndTag,
int* curLineNumPtr);
1048 XMLComment(
const XMLComment& );
1049 XMLComment& operator=(
const XMLComment& );
1075 virtual bool Accept( XMLVisitor* visitor )
const;
1077 virtual XMLNode* ShallowClone( XMLDocument* document )
const;
1078 virtual bool ShallowEqual(
const XMLNode* compare )
const;
1081 XMLDeclaration( XMLDocument* doc );
1082 virtual ~XMLDeclaration();
1084 char* ParseDeep(
char* p, StrPair* parentEndTag,
int* curLineNumPtr );
1087 XMLDeclaration(
const XMLDeclaration& );
1088 XMLDeclaration& operator=(
const XMLDeclaration& );
1106 virtual const XMLUnknown* ToUnknown()
const {
1110 virtual bool Accept( XMLVisitor* visitor )
const;
1112 virtual XMLNode* ShallowClone( XMLDocument* document )
const;
1113 virtual bool ShallowEqual(
const XMLNode* compare )
const;
1116 XMLUnknown( XMLDocument* doc );
1117 virtual ~XMLUnknown();
1119 char* ParseDeep(
char* p, StrPair* parentEndTag,
int* curLineNumPtr );
1122 XMLUnknown(
const XMLUnknown& );
1123 XMLUnknown& operator=(
const XMLUnknown& );
1139 const char* Name()
const;
1142 const char* Value()
const;
1162 int64_t Int64Value()
const {
1164 QueryInt64Value(&i);
1171 QueryUnsignedValue( &i );
1177 QueryBoolValue( &b );
1183 QueryDoubleValue( &d );
1189 QueryFloatValue( &f );
1197 XMLError QueryIntValue(
int* value )
const;
1199 XMLError QueryUnsignedValue(
unsigned int* value )
const;
1201 XMLError QueryInt64Value(int64_t* value)
const;
1203 XMLError QueryBoolValue(
bool* value )
const;
1205 XMLError QueryDoubleValue(
double* value )
const;
1207 XMLError QueryFloatValue(
float* value )
const;
1210 void SetAttribute(
const char* value );
1212 void SetAttribute(
int value );
1214 void SetAttribute(
unsigned value );
1216 void SetAttribute(int64_t value);
1218 void SetAttribute(
bool value );
1220 void SetAttribute(
double value );
1222 void SetAttribute(
float value );
1225 enum { BUF_SIZE = 200 };
1227 XMLAttribute() : _name(), _value(),_parseLineNum( 0 ), _next( 0 ), _memPool( 0 ) {}
1228 virtual ~XMLAttribute() {}
1230 XMLAttribute(
const XMLAttribute& );
1231 void operator=(
const XMLAttribute& );
1232 void SetName(
const char* name );
1234 char* ParseDeep(
char* p,
bool processEntities,
int* curLineNumPtr );
1236 mutable StrPair _name;
1237 mutable StrPair _value;
1239 XMLAttribute* _next;
1257 void SetName(
const char* str,
bool staticMem=
false ) {
1258 SetValue( str, staticMem );
1264 virtual const XMLElement* ToElement()
const {
1267 virtual bool Accept( XMLVisitor* visitor )
const;
1292 const char* Attribute(
const char* name,
const char* value=0 )
const;
1300 int IntAttribute(
const char* name,
int defaultValue = 0)
const;
1302 unsigned UnsignedAttribute(
const char* name,
unsigned defaultValue = 0)
const;
1304 int64_t Int64Attribute(
const char* name, int64_t defaultValue = 0)
const;
1306 bool BoolAttribute(
const char* name,
bool defaultValue =
false)
const;
1308 double DoubleAttribute(
const char* name,
double defaultValue = 0)
const;
1310 float FloatAttribute(
const char* name,
float defaultValue = 0)
const;
1328 return XML_NO_ATTRIBUTE;
1337 return XML_NO_ATTRIBUTE;
1346 return XML_NO_ATTRIBUTE;
1355 return XML_NO_ATTRIBUTE;
1363 return XML_NO_ATTRIBUTE;
1371 return XML_NO_ATTRIBUTE;
1380 return XML_NO_ATTRIBUTE;
1382 *value = a->
Value();
1406 return QueryIntAttribute( name, value );
1409 int QueryAttribute(
const char* name,
unsigned int* value )
const {
1410 return QueryUnsignedAttribute( name, value );
1413 int QueryAttribute(
const char* name, int64_t* value)
const {
1414 return QueryInt64Attribute(name, value);
1417 int QueryAttribute(
const char* name,
bool* value )
const {
1418 return QueryBoolAttribute( name, value );
1421 int QueryAttribute(
const char* name,
double* value )
const {
1422 return QueryDoubleAttribute( name, value );
1425 int QueryAttribute(
const char* name,
float* value )
const {
1426 return QueryFloatAttribute( name, value );
1470 void DeleteAttribute(
const char* name );
1474 return _rootAttribute;
1477 const XMLAttribute* FindAttribute(
const char* name )
const;
1507 const char* GetText()
const;
1543 void SetText(
const char* inText );
1545 void SetText(
int value );
1547 void SetText(
unsigned value );
1549 void SetText(int64_t value);
1551 void SetText(
bool value );
1553 void SetText(
double value );
1555 void SetText(
float value );
1583 XMLError QueryIntText(
int* ival )
const;
1585 XMLError QueryUnsignedText(
unsigned* uval )
const;
1587 XMLError QueryInt64Text(int64_t* uval)
const;
1589 XMLError QueryBoolText(
bool* bval )
const;
1591 XMLError QueryDoubleText(
double* dval )
const;
1593 XMLError QueryFloatText(
float* fval )
const;
1595 int IntText(
int defaultValue = 0)
const;
1598 unsigned UnsignedText(
unsigned defaultValue = 0)
const;
1600 int64_t Int64Text(int64_t defaultValue = 0)
const;
1602 bool BoolText(
bool defaultValue =
false)
const;
1604 double DoubleText(
double defaultValue = 0)
const;
1606 float FloatText(
float defaultValue = 0)
const;
1609 enum ElementClosingType {
1614 ElementClosingType ClosingType()
const {
1615 return _closingType;
1617 virtual XMLNode* ShallowClone( XMLDocument* document )
const;
1618 virtual bool ShallowEqual(
const XMLNode* compare )
const;
1621 char* ParseDeep(
char* p, StrPair* parentEndTag,
int* curLineNumPtr );
1624 XMLElement( XMLDocument* doc );
1625 virtual ~XMLElement();
1626 XMLElement(
const XMLElement& );
1627 void operator=(
const XMLElement& );
1629 XMLAttribute* FindAttribute(
const char* name ) {
1630 return const_cast<XMLAttribute*
>(
const_cast<const XMLElement*
>(
this)->FindAttribute( name ));
1632 XMLAttribute* FindOrCreateAttribute(
const char* name );
1634 char* ParseAttributes(
char* p,
int* curLineNumPtr );
1635 static void DeleteAttribute( XMLAttribute* attribute );
1636 XMLAttribute* CreateAttribute();
1638 enum { BUF_SIZE = 200 };
1639 ElementClosingType _closingType;
1643 XMLAttribute* _rootAttribute;
1648 PRESERVE_WHITESPACE,
1670 XMLDocument(
bool processEntities =
true, Whitespace whitespaceMode = PRESERVE_WHITESPACE );
1674 TIXMLASSERT(
this == _document );
1678 TIXMLASSERT(
this == _document );
1692 XMLError Parse(
const char* xml,
size_t nBytes=(
size_t)(-1) );
1699 XMLError LoadFile(
const char* filename );
1712 XMLError LoadFile( FILE* );
1719 XMLError SaveFile(
const char* filename,
bool compact =
false );
1728 XMLError SaveFile( FILE* fp,
bool compact =
false );
1730 bool ProcessEntities()
const {
1731 return _processEntities;
1733 Whitespace WhitespaceMode()
const {
1734 return _whitespaceMode;
1753 return FirstChildElement();
1756 return FirstChildElement();
1773 void Print( XMLPrinter* streamer=0 )
const;
1774 virtual bool Accept( XMLVisitor* visitor )
const;
1781 XMLElement* NewElement(
const char* name );
1787 XMLComment* NewComment(
const char* comment );
1793 XMLText* NewText(
const char* text );
1805 XMLDeclaration* NewDeclaration(
const char* text=0 );
1811 XMLUnknown* NewUnknown(
const char* text );
1817 void DeleteNode( XMLNode* node );
1820 SetError(XML_SUCCESS, 0, 0);
1825 return _errorID != XML_SUCCESS;
1831 const char* ErrorName()
const;
1832 static const char* ErrorIDToName(XMLError errorID);
1837 const char* ErrorStr()
const;
1840 void PrintError()
const;
1845 return _errorLineNum;
1861 char* Identify(
char* p,
XMLNode** node );
1878 bool _processEntities;
1880 Whitespace _whitespaceMode;
1881 mutable StrPair _errorStr;
1884 int _parseCurLineNum;
1892 DynArray<XMLNode*, 10> _unlinked;
1896 MemPoolT<
sizeof(
XMLText) > _textPool;
1899 static const char* _errorNames[XML_ERROR_COUNT];
1903 void SetError( XMLError error,
int lineNum,
const char* format, ... );
1908 class DepthTracker {
1911 this->_document = document;
1912 document->PushDepth();
1915 _document->PopDepth();
1918 XMLDocument * _document;
1923 template<
class NodeType,
int PoolElementSize>
1924 NodeType* CreateUnlinkedNode( MemPoolT<PoolElementSize>& pool );
1927 template<
class NodeType,
int PoolElementSize>
1928 inline NodeType* XMLDocument::CreateUnlinkedNode( MemPoolT<PoolElementSize>& pool )
1930 TIXMLASSERT(
sizeof( NodeType ) == PoolElementSize );
1931 TIXMLASSERT(
sizeof( NodeType ) == pool.ItemSize() );
1932 NodeType* returnNode =
new (pool.Alloc()) NodeType(
this );
1933 TIXMLASSERT( returnNode );
1934 returnNode->_memPool = &pool;
1936 _unlinked.Push(returnNode);
2015 return XMLHandle( _node ? _node->FirstChild() : 0 );
2019 return XMLHandle( _node ? _node->FirstChildElement( name ) : 0 );
2023 return XMLHandle( _node ? _node->LastChild() : 0 );
2027 return XMLHandle( _node ? _node->LastChildElement( name ) : 0 );
2031 return XMLHandle( _node ? _node->PreviousSibling() : 0 );
2035 return XMLHandle( _node ? _node->PreviousSiblingElement( name ) : 0 );
2039 return XMLHandle( _node ? _node->NextSibling() : 0 );
2043 return XMLHandle( _node ? _node->NextSiblingElement( name ) : 0 );
2052 return ( _node ? _node->ToElement() : 0 );
2056 return ( _node ? _node->ToText() : 0 );
2060 return ( _node ? _node->ToUnknown() : 0 );
2064 return ( _node ? _node->ToDeclaration() : 0 );
2094 const XMLConstHandle FirstChildElement(
const char* name = 0 )
const {
2095 return XMLConstHandle( _node ? _node->FirstChildElement( name ) : 0 );
2100 const XMLConstHandle LastChildElement(
const char* name = 0 )
const {
2101 return XMLConstHandle( _node ? _node->LastChildElement( name ) : 0 );
2106 const XMLConstHandle PreviousSiblingElement(
const char* name = 0 )
const {
2107 return XMLConstHandle( _node ? _node->PreviousSiblingElement( name ) : 0 );
2112 const XMLConstHandle NextSiblingElement(
const char* name = 0 )
const {
2113 return XMLConstHandle( _node ? _node->NextSiblingElement( name ) : 0 );
2117 const XMLNode* ToNode()
const {
2121 return ( _node ? _node->ToElement() : 0 );
2123 const XMLText* ToText()
const {
2124 return ( _node ? _node->ToText() : 0 );
2127 return ( _node ? _node->ToUnknown() : 0 );
2130 return ( _node ? _node->ToDeclaration() : 0 );
2189 XMLPrinter( FILE* file=0,
bool compact =
false,
int depth = 0 );
2193 void PushHeader(
bool writeBOM,
bool writeDeclaration );
2197 void OpenElement(
const char* name,
bool compactMode=
false );
2199 void PushAttribute(
const char* name,
const char* value );
2200 void PushAttribute(
const char* name,
int value );
2201 void PushAttribute(
const char* name,
unsigned value );
2202 void PushAttribute(
const char* name, int64_t value);
2203 void PushAttribute(
const char* name,
bool value );
2204 void PushAttribute(
const char* name,
double value );
2206 virtual void CloseElement(
bool compactMode=
false );
2209 void PushText(
const char* text,
bool cdata=
false );
2211 void PushText(
int value );
2213 void PushText(
unsigned value );
2215 void PushText(int64_t value);
2217 void PushText(
bool value );
2219 void PushText(
float value );
2221 void PushText(
double value );
2224 void PushComment(
const char* comment );
2226 void PushDeclaration(
const char* value );
2227 void PushUnknown(
const char* value );
2235 virtual bool VisitExit(
const XMLElement& element );
2237 virtual bool Visit(
const XMLText& text );
2238 virtual bool Visit(
const XMLComment& comment );
2240 virtual bool Visit(
const XMLUnknown& unknown );
2247 return _buffer.Mem();
2255 return _buffer.Size();
2264 _firstElement =
true;
2268 virtual bool CompactMode(
const XMLElement& ) {
return _compactMode; }
2273 virtual void PrintSpace(
int depth );
2274 void Print(
const char* format, ... );
2275 void Write(
const char* data,
size_t size );
2276 inline void Write(
const char* data ) { Write( data, strlen( data ) ); }
2277 void Putc(
char ch );
2279 void SealElementIfJustOpened();
2280 bool _elementJustOpened;
2281 DynArray< const char*, 10 > _stack;
2284 void PrintString(
const char*,
bool restrictedEntitySet );
2290 bool _processEntities;
2297 bool _entityFlag[ENTITY_RANGE];
2298 bool _restrictedEntityFlag[ENTITY_RANGE];
2300 DynArray< char, 20 > _buffer;
2303 XMLPrinter(
const XMLPrinter& );
2304 XMLPrinter& operator=(
const XMLPrinter& );
2310 #if defined(_MSC_VER)
2311 # pragma warning(pop)
2314 #endif // TINYXML2_INCLUDED