130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwww.sourceforge.net/projects/tinyxml 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunOriginal code by Lee Thomason (www.grinninglizard.com) 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunThis software is provided 'as-is', without any express or implied 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwarranty. In no event will the authors be held liable for any 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundamages arising from the use of this software. 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunPermission is granted to anyone to use this software for any 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpurpose, including commercial applications, and to alter it and 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunredistribute it freely, subject to the following restrictions: 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun1. The origin of this software must not be misrepresented; you must 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnot claim that you wrote the original software. If you use this 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunsoftware in a product, an acknowledgment in the product documentation 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwould be appreciated but is not required. 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun2. Altered source versions must be plainly marked as such, and 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunmust not be misrepresented as being the original software. 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun3. This notice may not be removed or altered from any source 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundistribution. 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef TINYXML_INCLUDED 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define TINYXML_INCLUDED 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef _MSC_VER 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( push ) 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( disable : 4530 ) 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( disable : 4786 ) 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <ctype.h> 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h> 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdlib.h> 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string.h> 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <assert.h> 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Help out windows: 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined( _DEBUG ) && !defined( DEBUG ) 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define DEBUG 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #include <string> 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #include <iostream> 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #include <sstream> 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_STRING std::string 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #include "tinystr.h" 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_STRING TiXmlString 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Deprecated library function hell. Compilers want to use the 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// new safe versions. This probably doesn't fully address the problem, 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// but it gets closer. There are too many compilers for me to fully 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// test. If you get compilation troubles, undefine TIXML_SAFE 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define TIXML_SAFE 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_SAFE 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Microsoft visual studio, version 2005 and higher. 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SNPRINTF _snprintf_s 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SSCANF sscanf_s 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Microsoft visual studio, version 6 and higher. 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //#pragma message( "Using _sn* functions." ) 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SNPRINTF _snprintf 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SSCANF sscanf 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #elif defined(__GNUC__) && (__GNUC__ >= 3 ) 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // GCC version 3 and higher.s 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //#warning( "Using sn* functions." ) 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SNPRINTF snprintf 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SSCANF sscanf 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #else 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SNPRINTF snprintf 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #define TIXML_SSCANF sscanf 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDocument; 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlElement; 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlComment; 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlUnknown; 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlAttribute; 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlText; 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDeclaration; 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlParsingData; 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int TIXML_MAJOR_VERSION = 2; 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int TIXML_MINOR_VERSION = 6; 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int TIXML_PATCH_VERSION = 2; 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* Internal structure for tracking location of items 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun in the XML file. 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct TiXmlCursor 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlCursor() { Clear(); } 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Clear() { row = col = -1; } 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int row; // 0 based. 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int col; // 0 based. 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Implements the interface to the "Visitor pattern" (see the Accept() method.) 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If you call the Accept() method, it requires being passed a TiXmlVisitor 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class to handle callbacks. For nodes that contain other nodes (Document, Element) 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun are simply called with Visit(). 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If you return 'true' from a Visit method, recursive parsing will continue. If you return 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun false, <b>no children of this node or its sibilings</b> will be Visited. 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun All flavors of Visit methods have a default implementation that returns 'true' (continue 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun visiting). You need to only override methods that are interesting to you. 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun You should never change the document from a callback. 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @sa TiXmlNode::Accept() 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlVisitor 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlVisitor() {} 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit a document. 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit a document. 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit an element. 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit an element. 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit a declaration 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit a text node 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit a comment node 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Visit an unknown node 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Only used by Attribute::Query functions 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunenum 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_SUCCESS, 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_NO_ATTRIBUTE, 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_WRONG_TYPE 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Used by the parsing routines. 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunenum TiXmlEncoding 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ENCODING_UNKNOWN, 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ENCODING_UTF8, 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ENCODING_LEGACY 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** TiXmlBase is a base class for every class in TinyXml. 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun It does little except to establish that TinyXml classes 17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun can be printed and provide some utility functions. 17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun In XML, the document and elements can contain 17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun other elements and other types of nodes. 17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A Document can contain: Element (container or leaf) 18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Comment (leaf) 18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Unknown (leaf) 18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Declaration( leaf ) 18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun An Element can contain: Element (container or leaf) 18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Text (leaf) 18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Attributes (not on tree) 18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Comment (leaf) 18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Unknown (leaf) 19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A Decleration contains: Attributes (not on tree) 19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlBase 19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlNode; 19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlElement; 19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlDocument; 19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlBase() : userData(0) {} 20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlBase() {} 20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** All TinyXml classes can print themselves to a filestream 20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun or the string class (TiXmlString in non-STL mode, std::string 20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun in STL mode.) Either or both cfile and str can be null. 20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun This is a formatted print, and will insert 20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun tabs and newlines. 21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (For an unformatted stream, use the << operator.) 21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const = 0; 21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** The world does not agree on whether white space should be kept or 21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun not. In order to make everyone happy, these global, static functions 21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun are provided to set whether or not TinyXml will condense all white space 21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun into a single space or not. The default is to condense. Note changing this 21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun value is not thread safe. 22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } 22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return the current white space setting. 22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } 22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return the position, in the original source file, of this node or attribute. 22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The row and column are 1-based. (That is the first row and first column is 22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1,1). If the returns values are 0 or less, then the parser does not have 22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun a row and column value. 23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Generally, the row and column value will be set when the TiXmlDocument::Load(), 23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set 23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun when the DOM was created from operator>>. 23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The values reflect the initial load. Once the DOM is modified programmatically 23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (by adding or changing nodes and attributes) the new values will NOT update to 23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun reflect changes in the document. 23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun There is a minor performance cost to computing the row and column. Computation 24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. 24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @sa TiXmlDocument::SetTabSize() 24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int Row() const { return location.row + 1; } 24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int Column() const { return location.col + 1; } ///< See Row() 24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. 24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. 24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. 25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Table that returs, for a given lead byte, the total number of bytes 25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // in the UTF-8 sequence. 25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static const int utf8ByteTable[256]; 25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, 25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlParsingData* data, 25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; 25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, 26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun or they will be transformed into entities! 26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); 26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum 26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_NO_ERROR = 0, 26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR, 26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_OPENING_FILE, 26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_PARSING_ELEMENT, 27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, 27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_READING_ELEMENT_VALUE, 27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_READING_ATTRIBUTES, 27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_PARSING_EMPTY, 27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_READING_END_TAG, 27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_PARSING_UNKNOWN, 27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_PARSING_COMMENT, 27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_PARSING_DECLARATION, 27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_DOCUMENT_EMPTY, 27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_EMBEDDED_NULL, 28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_PARSING_CDATA, 28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_DOCUMENT_TOP_ONLY, 28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_ERROR_STRING_COUNT 28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected: 28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); 28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun inline static bool IsWhiteSpace( char c ) 29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); 29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun inline static bool IsWhiteSpace( int c ) 29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( c < 256 ) 29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return IsWhiteSpace( (char) c ); 29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return false; // Again, only truly correct for English/Latin...but usually works. 29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); 30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); 30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 30630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* Reads an XML name into the string provided. Returns 30730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun a pointer just past the last character of the name, 30830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun or 0 if the function has an error. 30930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 31030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); 31130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 31230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* Reads text. Returns a pointer past the given end tag. 31330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Wickedly complex options, but it keeps the (sensitive) code in one place. 31430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 31530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static const char* ReadText( const char* in, // where to start 31630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING* text, // the string read 31730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool ignoreWhiteSpace, // whether to keep the white space 31830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* endTag, // what ends this text 31930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool ignoreCase, // whether to ignore case in the end tag 32030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlEncoding encoding ); // the current encoding 32130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // If an entity has been found, transform it into a character. 32330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); 32430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get a character, while interpreting entities. 32630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // The length can be from 0 to 4 bytes. 32730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) 32830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 32930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun assert( p ); 33030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( encoding == TIXML_ENCODING_UTF8 ) 33130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 33230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *length = utf8ByteTable[ *((const unsigned char*)p) ]; 33330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun assert( *length >= 0 && *length < 5 ); 33430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 33530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun else 33630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 33730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *length = 1; 33830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 33930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 34030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( *length == 1 ) 34130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 34230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( *p == '&' ) 34330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return GetEntity( p, _value, length, encoding ); 34430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *_value = *p; 34530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return p+1; 34630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 34730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun else if ( *length ) 34830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 34930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), 35030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // and the null terminator isn't needed 35130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for( int i=0; p[i] && i<*length; ++i ) { 35230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun _value[i] = p[i]; 35330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 35430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return p + (*length); 35530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 35630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun else 35730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 35830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Not valid text. 35930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return 0; 36030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 36130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 36230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 36330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Return true if the next characters in the stream are any of the endTag sequences. 36430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Ignore case only works for english, and should only be relied on when comparing 36530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // to English words: StringEqual( p, "version", true ) is fine. 36630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool StringEqual( const char* p, 36730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* endTag, 36830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool ignoreCase, 36930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlEncoding encoding ); 37030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 37130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; 37230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 37330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlCursor location; 37430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 37530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Field containing a generic user pointer 37630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void* userData; 37730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 37830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // None of these methods are reliable for any language except English. 37930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Good for approximation, not great for accuracy. 38030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); 38130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); 38230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun inline static int ToLower( int v, TiXmlEncoding encoding ) 38330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 38430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( encoding == TIXML_ENCODING_UTF8 ) 38530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 38630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( v < 128 ) return tolower( v ); 38730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return v; 38830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 38930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun else 39030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 39130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return tolower( v ); 39230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 39330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 39430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); 39530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 39630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 39730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlBase( const TiXmlBase& ); // not implemented. 39830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void operator=( const TiXmlBase& base ); // not allowed. 39930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 40030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun struct Entity 40130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 40230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* str; 40330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun unsigned int strLength; 40430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun char chr; 40530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 40630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum 40730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 40830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun NUM_ENTITY = 5, 40930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun MAX_ENTITY_LENGTH = 6 41030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 41130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 41230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static Entity entity[ NUM_ENTITY ]; 41330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool condenseWhiteSpace; 41430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 41530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 41630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 41730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** The parent class for everything in the Document Object Model. 41830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (Except for attributes). 41930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Nodes have siblings, a parent, and children. A node can be 42030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun in a document, or stand on its own. The type of a TiXmlNode 42130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun can be queried, and it can be cast to its more defined type. 42230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 42330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlNode : public TiXmlBase 42430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 42530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlDocument; 42630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlElement; 42730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 42830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 42930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 43030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 43130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** An input stream operator, for every class. Tolerant of newlines and 43230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun formatting, but doesn't expect them. 43330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 43430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend std::istream& operator >> (std::istream& in, TiXmlNode& base); 43530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 43630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** An output stream operator, for every class. Note that this outputs 43730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun without any newlines or formatting, as opposed to Print(), which 43830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun includes tabs and new lines. 43930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 44030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The operator<< and operator>> are not completely symmetric. Writing 44130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun a node to a stream is very well defined. You'll get a nice stream 44230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun of output, without any extra whitespace or newlines. 44330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 44430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun But reading is not as well defined. (As it always is.) If you create 44530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun a TiXmlElement (for example) and read that from an input stream, 44630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the text needs to define an element or junk will result. This is 44730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun true of all input streams, but it's worth keeping in mind. 44830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 44930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A TiXmlDocument will read nodes until it reads a root element, and 45030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun all the children of that root element. 45130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 45230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); 45330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 45430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Appends the XML node or attribute to a std::string. 45530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend std::string& operator<< (std::string& out, const TiXmlNode& base ); 45630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 45730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 45830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 45930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** The types of XML nodes supported by TinyXml. (All the 46030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun unsupported types are picked up by UNKNOWN.) 46130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 46230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum NodeType 46330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 46430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_DOCUMENT, 46530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_ELEMENT, 46630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_COMMENT, 46730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_UNKNOWN, 46830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_TEXT, 46930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_DECLARATION, 47030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_TYPECOUNT 47130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 47230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 47330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlNode(); 47430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 47530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** The meaning of 'value' changes for the specific type of 47630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode. 47730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 47830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Document: filename of the xml file 47930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Element: name of the element 48030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Comment: the comment text 48130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Unknown: the tag contents 48230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Text: the text string 48330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 48430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 48530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The subclasses will wrap this function. 48630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 48730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char *Value() const { return value.c_str (); } 48830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 48930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 49030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return Value() as a std::string. If you only use STL, 49130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun this is more efficient than calling Value(). 49230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Only available in STL mode. 49330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 49430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string& ValueStr() const { return value; } 49530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 49630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 49730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TIXML_STRING& ValueTStr() const { return value; } 49830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 49930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Changes the value of the node. Defined as: 50030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 50130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Document: filename of the xml file 50230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Element: name of the element 50330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Comment: the comment text 50430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Unknown: the tag contents 50530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Text: the text string 50630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 50730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 50830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetValue(const char * _value) { value = _value;} 50930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 51030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 51130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// STL std::string form. 51230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetValue( const std::string& _value ) { value = _value; } 51330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 51430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 51530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Delete all the children of this node. Does not affect 'this'. 51630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Clear(); 51730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 51830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// One step up the DOM. 51930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* Parent() { return parent; } 52030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* Parent() const { return parent; } 52130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 52230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. 52330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* FirstChild() { return firstChild; } 52430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. 52530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// The first child of this node with the matching 'value'. Will be null if none found. 52630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* FirstChild( const char * _value ) { 52730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) 52830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // call the method, cast the return back to non-const. 52930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); 53030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 53130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. 53230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* LastChild() { return lastChild; } 53330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 53430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. 53530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* LastChild( const char * _value ) { 53630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); 53730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 53830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 53930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 54030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. 54130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. 54230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. 54330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. 54430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 54530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 54630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** An alternate way to walk the children of a node. 54730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun One way to iterate over nodes is: 54830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 54930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for( child = parent->FirstChild(); child; child = child->NextSibling() ) 55030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 55130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 55230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IterateChildren does the same thing with the syntax: 55330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 55430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun child = 0; 55530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun while( child = parent->IterateChildren( child ) ) 55630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 55730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 55830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IterateChildren takes the previous child as input and finds 55930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the next one. If the previous child is null, it returns the 56030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun first. IterateChildren will return null when done. 56130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 56230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; 56330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* IterateChildren( const TiXmlNode* previous ) { 56430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); 56530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 56630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 56730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// This flavor of IterateChildren searches for children with a particular 'value' 56830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; 56930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { 57030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); 57130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 57230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 57330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 57430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. 57530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. 57630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 57730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 57830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Add a new node related to this. Adds a child past the LastChild. 57930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Returns a pointer to the new object or NULL if an error occured. 58030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 58130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); 58230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 58330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 58430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Add a new node related to this. Adds a child past the LastChild. 58530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 58630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun NOTE: the node to be added is passed by pointer, and will be 58730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun henceforth owned (and deleted) by tinyXml. This method is efficient 58830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and avoids an extra copy, but should be used with care as it 58930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun uses a different memory model than the other insert functions. 59030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 59130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @sa InsertEndChild 59230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 59330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* LinkEndChild( TiXmlNode* addThis ); 59430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 59530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Add a new node related to this. Adds a child before the specified child. 59630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Returns a pointer to the new object or NULL if an error occured. 59730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 59830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); 59930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 60030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Add a new node related to this. Adds a child after the specified child. 60130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Returns a pointer to the new object or NULL if an error occured. 60230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 60330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); 60430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 60530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Replace a child of this node. 60630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Returns a pointer to the new object or NULL if an error occured. 60730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 60830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); 60930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 61030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Delete a child of this node. 61130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool RemoveChild( TiXmlNode* removeThis ); 61230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 61330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Navigate to a sibling node. 61430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* PreviousSibling() const { return prev; } 61530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* PreviousSibling() { return prev; } 61630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 61730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Navigate to a sibling node. 61830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* PreviousSibling( const char * ) const; 61930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* PreviousSibling( const char *_prev ) { 62030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); 62130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 62230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 62330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 62430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. 62530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. 62630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. 62730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. 62830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 62930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 63030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Navigate to a sibling node. 63130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* NextSibling() const { return next; } 63230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* NextSibling() { return next; } 63330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 63430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Navigate to a sibling node with the given 'value'. 63530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlNode* NextSibling( const char * ) const; 63630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* NextSibling( const char* _next ) { 63730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); 63830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 63930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 64030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Convenience function to get through elements. 64130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Calls NextSibling and ToElement. Will skip all non-Element 64230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun nodes. Returns 0 if there is not another element. 64330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 64430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* NextSiblingElement() const; 64530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* NextSiblingElement() { 64630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); 64730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 64830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 64930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Convenience function to get through elements. 65030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Calls NextSibling and ToElement. Will skip all non-Element 65130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun nodes. Returns 0 if there is not another element. 65230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 65330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* NextSiblingElement( const char * ) const; 65430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* NextSiblingElement( const char *_next ) { 65530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); 65630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 65730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 65830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 65930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. 66030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. 66130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 66230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 66330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Convenience function to get through elements. 66430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* FirstChildElement() const; 66530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* FirstChildElement() { 66630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); 66730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 66830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 66930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Convenience function to get through elements. 67030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* FirstChildElement( const char * _value ) const; 67130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* FirstChildElement( const char * _value ) { 67230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); 67330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 67430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 67530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 67630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. 67730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. 67830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 67930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 68030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Query the type (as an enumerated value, above) of this node. 68130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, 68230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. 68330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 68430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int Type() const { return type; } 68530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 68630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return a pointer to the Document this node lives in. 68730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Returns null if not in a document. 68830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 68930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlDocument* GetDocument() const; 69030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument* GetDocument() { 69130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); 69230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 69330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 69430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Returns true if this node has no children. 69530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool NoChildren() const { return !firstChild; } 69630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 69730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 69830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 69930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 70430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 70930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. 71030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 71130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Create an exact duplicate of this node and return it. The memory must be deleted 71230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun by the caller. 71330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 71430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const = 0; 71530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 71630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the 71730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun XML tree will be conditionally visited and the host will be called back 71830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun via the TiXmlVisitor interface. 71930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 72030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse 72130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the XML for the callbacks, so the performance of TinyXML is unchanged by using this 72230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun interface versus any other.) 72330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 72430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The interface has been based on ideas from: 72530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 72630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - http://www.saxproject.org/ 72730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - http://c2.com/cgi/wiki?HierarchicalVisitorPattern 72830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 72930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Which are both good references for "visiting". 73030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 73130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun An example of using Accept(): 73230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 73330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlPrinter printer; 73430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun tinyxmlDoc.Accept( &printer ); 73530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* xmlcstr = printer.CStr(); 73630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 73730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 73830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* visitor ) const = 0; 73930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 74030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected: 74130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode( NodeType _type ); 74230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 74330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Copy to the allocated object. Shared functionality between Clone, Copy constructor, 74430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // and the assignment operator. 74530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlNode* target ) const; 74630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 74730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 74830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // The real work of the input operator. 74930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; 75030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 75130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 75230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Figure out what is at *p, and parse it. Returns null if it is not an xml node. 75330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); 75430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 75530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* parent; 75630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun NodeType type; 75730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 75830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* firstChild; 75930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* lastChild; 76030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 76130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING value; 76230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 76330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* prev; 76430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* next; 76530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 76630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 76730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode( const TiXmlNode& ); // not implemented. 76830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void operator=( const TiXmlNode& base ); // not allowed. 76930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 77030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 77130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 77230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** An attribute is a name-value pair. Elements have an arbitrary 77330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun number of attributes, each with a unique name. 77430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 77530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @note The attributes are not TiXmlNodes, since they are not 77630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun part of the tinyXML document object model. There are other 77730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun suggested ways to look at this problem. 77830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 77930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlAttribute : public TiXmlBase 78030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 78130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlAttributeSet; 78230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 78330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 78430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Construct an empty attribute. 78530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute() : TiXmlBase() 78630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 78730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun document = 0; 78830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun prev = next = 0; 78930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 79030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 79130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 79230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// std::string constructor. 79330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute( const std::string& _name, const std::string& _value ) 79430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 79530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun name = _name; 79630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun value = _value; 79730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun document = 0; 79830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun prev = next = 0; 79930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 80030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 80130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 80230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Construct an attribute with a name and value. 80330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute( const char * _name, const char * _value ) 80430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 80530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun name = _name; 80630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun value = _value; 80730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun document = 0; 80830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun prev = next = 0; 80930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 81030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 81130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. 81230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. 81330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 81430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. 81530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 81630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int IntValue() const; ///< Return the value of this attribute, converted to an integer. 81730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun double DoubleValue() const; ///< Return the value of this attribute, converted to a double. 81830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 81930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the tinyxml string representation 82030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TIXML_STRING& NameTStr() const { return name; } 82130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 82230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** QueryIntValue examines the value string. It is an alternative to the 82330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntValue() method with richer error checking. 82430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If the value is an integer, it is stored in 'value' and 82530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the call returns TIXML_SUCCESS. If it is not 82630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun an integer, it returns TIXML_WRONG_TYPE. 82730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 82830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A specialized but useful call. Note that for success it returns 0, 82930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun which is the opposite of almost all other TinyXml calls. 83030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 83130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryIntValue( int* _value ) const; 83230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// QueryDoubleValue examines the value string. See QueryIntValue(). 83330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryDoubleValue( double* _value ) const; 83430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 83530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. 83630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetValue( const char* _value ) { value = _value; } ///< Set the value. 83730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 83830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetIntValue( int _value ); ///< Set the value from an integer. 83930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetDoubleValue( double _value ); ///< Set the value from a double. 84030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 84130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 84230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// STL std::string form. 84330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetName( const std::string& _name ) { name = _name; } 84430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// STL std::string form. 84530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetValue( const std::string& _value ) { value = _value; } 84630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 84730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 84830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Get the next sibling attribute in the DOM. Returns null at end. 84930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* Next() const; 85030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* Next() { 85130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); 85230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 85330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 85430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Get the previous sibling attribute in the DOM. Returns null at beginning. 85530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* Previous() const; 85630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* Previous() { 85730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); 85830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 85930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 86030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } 86130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } 86230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } 86330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 86430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* Attribute parsing starts: first letter of the name 86530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun returns: the next char after the value end quote 86630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 86730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); 86830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 86930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Prints this Attribute to a FILE stream. 87030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const { 87130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Print( cfile, depth, 0 ); 87230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 87330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; 87430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 87530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // [internal use] 87630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Set the document pointer so the attribute can report errors. 87730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetDocument( TiXmlDocument* doc ) { document = doc; } 87830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 87930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 88030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute( const TiXmlAttribute& ); // not implemented. 88130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void operator=( const TiXmlAttribute& base ); // not allowed. 88230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 88330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument* document; // A pointer back to a document, for error reporting. 88430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING name; 88530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING value; 88630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* prev; 88730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* next; 88830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 88930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 89030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 89130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* A class used to manage a group of attributes. 89230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun It is only used internally, both by the ELEMENT and the DECLARATION. 89330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 89430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The set can be changed transparent to the Element and Declaration 89530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun classes that use it, but NOT transparent to the Attribute 89630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun which has to implement a next() and previous() method. Which makes 89730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun it a bit problematic and prevents the use of STL. 89830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 89930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun This version is implemented with circular lists because: 90030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - I like circular lists 90130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - it demonstrates some independence from the (typical) doubly linked list. 90230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 90330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlAttributeSet 90430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 90530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 90630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttributeSet(); 90730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ~TiXmlAttributeSet(); 90830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 90930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Add( TiXmlAttribute* attribute ); 91030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Remove( TiXmlAttribute* attribute ); 91130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 91230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } 91330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } 91430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } 91530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } 91630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 91730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* Find( const char* _name ) const; 91830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* FindOrCreate( const char* _name ); 91930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 92030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun# ifdef TIXML_USE_STL 92130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* Find( const std::string& _name ) const; 92230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* FindOrCreate( const std::string& _name ); 92330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun# endif 92430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 92530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 92630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 92730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), 92830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //*ME: this class must be also use a hidden/disabled copy-constructor !!! 92930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed 93030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) 93130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 93230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute sentinel; 93330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 93430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 93530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 93630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** The element is a container class. It has a value, the element name, 93730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and can contain other elements, text, comments, and unknowns. 93830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Elements also contain an arbitrary number of attributes. 93930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 94030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlElement : public TiXmlNode 94130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 94230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 94330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Construct an element. 94430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement (const char * in_value); 94530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 94630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 94730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// std::string constructor. 94830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement( const std::string& _value ); 94930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 95030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 95130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement( const TiXmlElement& ); 95230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 95330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement& operator=( const TiXmlElement& base ); 95430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 95530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlElement(); 95630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 95730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Given an attribute name, Attribute() returns the value 95830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for the attribute of that name, or null if none exists. 95930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 96030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* Attribute( const char* name ) const; 96130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 96230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Given an attribute name, Attribute() returns the value 96330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for the attribute of that name, or null if none exists. 96430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If the attribute exists and can be converted to an integer, 96530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the integer value will be put in the return 'i', if 'i' 96630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun is non-null. 96730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 96830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* Attribute( const char* name, int* i ) const; 96930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 97030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Given an attribute name, Attribute() returns the value 97130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for the attribute of that name, or null if none exists. 97230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If the attribute exists and can be converted to an double, 97330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the double value will be put in the return 'd', if 'd' 97430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun is non-null. 97530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 97630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* Attribute( const char* name, double* d ) const; 97730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 97830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** QueryIntAttribute examines the attribute - it is an alternative to the 97930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Attribute() method with richer error checking. 98030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If the attribute is an integer, it is stored in 'value' and 98130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the call returns TIXML_SUCCESS. If it is not 98230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun an integer, it returns TIXML_WRONG_TYPE. If the attribute 98330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun does not exist, then TIXML_NO_ATTRIBUTE is returned. 98430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 98530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryIntAttribute( const char* name, int* _value ) const; 98630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). 98730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; 98830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). 98930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Note that '1', 'true', or 'yes' are considered true, while '0', 'false' 99030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and 'no' are considered false. 99130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 99230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryBoolAttribute( const char* name, bool* _value ) const; 99330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). 99430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryDoubleAttribute( const char* name, double* _value ) const; 99530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). 99630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryFloatAttribute( const char* name, float* _value ) const { 99730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun double d; 99830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int result = QueryDoubleAttribute( name, &d ); 99930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( result == TIXML_SUCCESS ) { 100030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *_value = (float)d; 100130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 100230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return result; 100330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 100430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 100530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 100630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). 100730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryStringAttribute( const char* name, std::string* _value ) const { 100830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* cstr = Attribute( name ); 100930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( cstr ) { 101030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *_value = std::string( cstr ); 101130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_SUCCESS; 101230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 101330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_NO_ATTRIBUTE; 101430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 101530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 101630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Template form of the attribute query which will try to read the 101730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun attribute into the specified type. Very easy, very powerful, but 101830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun be careful to make sure to call this with the correct type. 101930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 102030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun NOTE: This method doesn't work correctly for 'string' types that contain spaces. 102130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 102230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE 102330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 102430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const 102530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 102630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* node = attributeSet.Find( name ); 102730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( !node ) 102830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_NO_ATTRIBUTE; 102930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 103030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun std::stringstream sstream( node->ValueStr() ); 103130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun sstream >> *outValue; 103230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( !sstream.fail() ) 103330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_SUCCESS; 103430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_WRONG_TYPE; 103530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 103630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 103730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryValueAttribute( const std::string& name, std::string* outValue ) const 103830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 103930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* node = attributeSet.Find( name ); 104030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( !node ) 104130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_NO_ATTRIBUTE; 104230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *outValue = node->ValueStr(); 104330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return TIXML_SUCCESS; 104430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 104530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 104630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 104730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Sets an attribute of name to a given value. The attribute 104830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun will be created if it does not exist, or changed if it does. 104930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 105030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetAttribute( const char* name, const char * _value ); 105130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 105230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 105330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string* Attribute( const std::string& name ) const; 105430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string* Attribute( const std::string& name, int* i ) const; 105530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string* Attribute( const std::string& name, double* d ) const; 105630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryIntAttribute( const std::string& name, int* _value ) const; 105730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int QueryDoubleAttribute( const std::string& name, double* _value ) const; 105830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 105930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// STL std::string form. 106030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetAttribute( const std::string& name, const std::string& _value ); 106130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ///< STL std::string form. 106230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetAttribute( const std::string& name, int _value ); 106330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ///< STL std::string form. 106430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetDoubleAttribute( const std::string& name, double value ); 106530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 106630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 106730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Sets an attribute of name to a given value. The attribute 106830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun will be created if it does not exist, or changed if it does. 106930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 107030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetAttribute( const char * name, int value ); 107130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 107230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Sets an attribute of name to a given value. The attribute 107330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun will be created if it does not exist, or changed if it does. 107430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 107530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetDoubleAttribute( const char * name, double value ); 107630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 107730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Deletes an attribute with the given name. 107830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 107930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void RemoveAttribute( const char * name ); 108030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 108130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. 108230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 108330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 108430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. 108530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } 108630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. 108730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } 108830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 108930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Convenience function for easy access to the text inside an element. Although easy 109030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and concise, GetText() is limited compared to getting the TiXmlText child 109130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and accessing it directly. 109230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 109330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun If the first child of 'this' is a TiXmlText, the GetText() 109430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun returns the character string of the Text node, else null is returned. 109530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 109630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun This is a convenient method for getting the text of simple contained text: 109730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 109830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <foo>This is text</foo> 109930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* str = fooElement->GetText(); 110030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 110130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 110230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 'str' will be a pointer to "This is text". 110330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 110430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Note that this function can be misleading. If the element foo was created from 110530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun this XML: 110630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 110730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <foo><b>This is text</b></foo> 110830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 110930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 111030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun then the value of str would be null. The first child node isn't a text node, it is 111130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun another element. From this XML: 111230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 111330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <foo>This is <b>text</b></foo> 111430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 111530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GetText() will return "This is ". 111630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 111730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WARNING: GetText() accesses a child node - don't become confused with the 111830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are 111930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun safe type casts on the referenced node. 112030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 112130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* GetText() const; 112230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 112330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Creates a new Element and returns it - the returned element is a copy. 112430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const; 112530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Print the Element to a FILE stream. 112630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const; 112730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 112830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* Attribtue parsing starts: next char past '<' 112930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun returns: next char past '>' 113030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 113130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); 113230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 113330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 113430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 113530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 113630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Walk the XML tree visiting this node and all of its children. 113730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 113830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* visitor ) const; 113930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 114030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected: 114130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 114230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlElement* target ) const; 114330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void ClearThis(); // like clear, but initializes 'this' object as well 114430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 114530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Used to be public [internal use] 114630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 114730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); 114830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 114930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* [internal use] 115030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Reads the "value" of the element -- another element, or text. 115130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun This should terminate with the current end tag. 115230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 115330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); 115430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 115530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 115630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlAttributeSet attributeSet; 115730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 115830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 115930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 116030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** An XML comment. 116130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 116230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlComment : public TiXmlNode 116330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 116430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 116530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Constructs an empty comment. 116630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} 116730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Construct a comment from text. 116830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { 116930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SetValue( _value ); 117030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 117130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlComment( const TiXmlComment& ); 117230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlComment& operator=( const TiXmlComment& base ); 117330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 117430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlComment() {} 117530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 117630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Returns a copy of this Comment. 117730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const; 117830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Write this Comment to a FILE stream. 117930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const; 118030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 118130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* Attribtue parsing starts: at the ! of the !-- 118230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun returns: next char past '>' 118330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 118430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); 118530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 118630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 118730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 118830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 118930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Walk the XML tree visiting this node and all of its children. 119030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 119130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* visitor ) const; 119230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 119330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected: 119430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlComment* target ) const; 119530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 119630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // used to be public 119730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 119830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); 119930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 120030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// virtual void StreamOut( TIXML_OSTREAM * out ) const; 120130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 120230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 120330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 120430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 120530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 120630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 120730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** XML text. A text node can have 2 ways to output the next. "normal" output 120830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and CDATA. It will default to the mode it was parsed from the XML file and 120930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun you generally want to leave it alone, but you can change the output mode with 121030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SetCDATA() and query it with CDATA(). 121130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 121230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlText : public TiXmlNode 121330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 121430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class TiXmlElement; 121530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 121630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Constructor for text element. By default, it is treated as 121730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun normal, encoded text. If you want it be output as a CDATA text 121830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun element, set the parameter _cdata to 'true' 121930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 122030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) 122130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 122230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SetValue( initValue ); 122330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun cdata = false; 122430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 122530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlText() {} 122630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 122730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 122830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Constructor. 122930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) 123030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 123130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SetValue( initValue ); 123230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun cdata = false; 123330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 123430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 123530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 123630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } 123730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } 123830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 123930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Write this text object to a FILE stream. 124030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const; 124130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 124230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Queries whether this represents text using a CDATA section. 124330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool CDATA() const { return cdata; } 124430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Turns on or off a CDATA representation of text. 124530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetCDATA( bool _cdata ) { cdata = _cdata; } 124630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 124730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); 124830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 124930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 125030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 125130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 125230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Walk the XML tree visiting this node and all of its children. 125330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 125430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* content ) const; 125530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 125630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected : 125730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// [internal use] Creates a new Element and returns it. 125830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const; 125930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlText* target ) const; 126030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 126130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool Blank() const; // returns true if all white space and new lines 126230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // [internal use] 126330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 126430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); 126530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 126630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 126730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 126830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool cdata; // true if this should be input and output as a CDATA style text element 126930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 127030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 127130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 127230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** In correct XML the declaration is the first entry in the file. 127330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 127430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <?xml version="1.0" standalone="yes"?> 127530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 127630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 127730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TinyXml will happily read or write files without a declaration, 127830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun however. There are 3 possible attributes to the declaration: 127930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun version, encoding, and standalone. 128030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 128130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Note: In this version of the code, the attributes are 128230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun handled as special cases, not generic attributes, simply 128330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun because there can only be at most 3 and they are always the same. 128430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 128530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDeclaration : public TiXmlNode 128630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 128730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 128830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Construct an empty declaration. 128930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} 129030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 129130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL 129230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Constructor. 129330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDeclaration( const std::string& _version, 129430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string& _encoding, 129530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string& _standalone ); 129630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 129730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 129830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Construct. 129930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDeclaration( const char* _version, 130030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* _encoding, 130130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* _standalone ); 130230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 130330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDeclaration( const TiXmlDeclaration& copy ); 130430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); 130530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 130630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlDeclaration() {} 130730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 130830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Version. Will return an empty string if none was found. 130930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char *Version() const { return version.c_str (); } 131030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Encoding. Will return an empty string if none was found. 131130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char *Encoding() const { return encoding.c_str (); } 131230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Is this a standalone document? 131330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char *Standalone() const { return standalone.c_str (); } 131430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 131530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Creates a copy of this Declaration and returns it. 131630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const; 131730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Print this declaration to a FILE stream. 131830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; 131930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const { 132030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Print( cfile, depth, 0 ); 132130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 132230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 132330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); 132430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 132530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 132630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 132730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 132830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Walk the XML tree visiting this node and all of its children. 132930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 133030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* visitor ) const; 133130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 133230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected: 133330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlDeclaration* target ) const; 133430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // used to be public 133530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 133630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); 133730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 133830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 133930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 134030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 134130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING version; 134230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING encoding; 134330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING standalone; 134430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 134530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 134630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 134730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** Any tag that tinyXml doesn't recognize is saved as an 134830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun unknown. It is a tag of text, but should not be modified. 134930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun It will be written back to the XML, unchanged, when the file 135030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun is saved. 135130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 135230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DTD tags get thrown into TiXmlUnknowns. 135330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 135430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlUnknown : public TiXmlNode 135530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 135630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 135730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} 135830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlUnknown() {} 135930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 136030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } 136130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } 136230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 136330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Creates a copy of this Unknown and returns it. 136430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const; 136530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Print this Unknown to a FILE stream. 136630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth ) const; 136730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 136830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); 136930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 137030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 137130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 137230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 137330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Walk the XML tree visiting this node and all of its children. 137430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 137530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* content ) const; 137630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 137730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected: 137830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlUnknown* target ) const; 137930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 138030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 138130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); 138230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 138330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 138430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 138530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 138630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 138730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 138830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 138930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** Always the top level node. A document binds together all the 139030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun XML pieces. It can be saved, loaded, and printed to the screen. 139130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The 'value' of a document node is the xml file name. 139230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 139330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDocument : public TiXmlNode 139430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 139530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 139630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Create an empty document, that has no name. 139730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument(); 139830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Create a document with a name. The name of the document is also the filename of the xml. 139930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument( const char * documentName ); 140030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 140130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 140230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Constructor. 140330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument( const std::string& documentName ); 140430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 140530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 140630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument( const TiXmlDocument& copy ); 140730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument& operator=( const TiXmlDocument& copy ); 140830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 140930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~TiXmlDocument() {} 141030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 141130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Load a file using the current document value. 141230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Returns true if successful. Will delete any existing 141330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun document data before loading. 141430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 141530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); 141630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Save a file using the current document value. Returns true if successful. 141730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool SaveFile() const; 141830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Load a file using the given filename. Returns true if successful. 141930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); 142030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Save a file using the given filename. Returns true if successful. 142130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool SaveFile( const char * filename ) const; 142230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Load a file using the given FILE*. Returns true if successful. Note that this method 142330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun doesn't stream - the entire object pointed at by the FILE* 142430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun will be interpreted as an XML file. TinyXML doesn't stream in XML from the current 142530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun file location. Streaming may be added in the future. 142630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 142730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); 142830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Save a file using the given FILE*. Returns true if successful. 142930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool SaveFile( FILE* ) const; 143030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 143130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 143230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. 143330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 143430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return LoadFile( filename.c_str(), encoding ); 143530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 143630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool SaveFile( const std::string& filename ) const ///< STL std::string version. 143730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 143830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return SaveFile( filename.c_str() ); 143930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 144030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 144130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 144230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Parse the given null terminated block of xml data. Passing in an encoding to this 144330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml 144430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun to use that encoding, regardless of what TinyXml might otherwise try to detect. 144530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 144630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); 144730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 144830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Get the root element -- the only top level element -- of the document. 144930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun In well formed XML, there should only be one. TinyXml is tolerant of 145030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun multiple elements at the document level. 145130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 145230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TiXmlElement* RootElement() const { return FirstChildElement(); } 145330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* RootElement() { return FirstChildElement(); } 145430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 145530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** If an error occurs, Error will be set to true. Also, 145630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - The ErrorId() will contain the integer identifier of the error (not generally useful) 145730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - The ErrorDesc() method will return the name of the error. (very useful) 145830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun - The ErrorRow() and ErrorCol() will return the location of the error (if known) 145930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 146030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool Error() const { return error; } 146130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 146230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Contains a textual (english) description of the error if one occurs. 146330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char * ErrorDesc() const { return errorDesc.c_str (); } 146430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 146530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Generally, you probably want the error string ( ErrorDesc() ). But if you 146630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun prefer the ErrorId, this function will fetch it. 146730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 146830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int ErrorId() const { return errorId; } 146930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 147030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Returns the location (if known) of the error. The first column is column 1, 147130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and the first row is row 1. A value of 0 means the row and column wasn't applicable 147230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun (memory errors, for example, have no row/column) or the parser lost the error. (An 147330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun error in the error reporting, in that case.) 147430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 147530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @sa SetTabSize, Row, Column 147630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 147730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int ErrorRow() const { return errorLocation.row+1; } 147830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() 147930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 148030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) 148130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun to report the correct values for row and column. It does not change the output 148230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun or input in any way. 148330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 148430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun By calling this method, with a tab size 148530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun greater than 0, the row and column of each node and attribute is stored 148630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun when the file is loaded. Very useful for tracking the DOM back in to 148730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the source file. 148830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 148930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The tab size is required for calculating the location of nodes. If not 149030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set, the default of 4 is used. The tabsize is set per document. Setting 149130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun the tabsize to 0 disables row/column tracking. 149230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 149330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Note that row and column tracking is not supported when using operator>>. 149430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 149530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The tab size needs to be enabled before the parse or load. Correct usage: 149630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 149730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlDocument doc; 149830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun doc.SetTabSize( 8 ); 149930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun doc.Load( "myfile.xml" ); 150030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 150130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 150230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @sa Row, Column 150330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 150430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetTabSize( int _tabsize ) { tabsize = _tabsize; } 150530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 150630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int TabSize() const { return tabsize; } 150730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 150830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** If you have handled the error, it can be reset with this call. The error 150930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun state is automatically cleared if you Parse a new XML block. 151030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 151130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void ClearError() { error = false; 151230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun errorId = 0; 151330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun errorDesc = ""; 151430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun errorLocation.row = errorLocation.col = 0; 151530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //errorLocation.last = 0; 151630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 151730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 151830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Write the document to standard out using formatted printing ("pretty print"). */ 151930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Print() const { Print( stdout, 0 ); } 152030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 152130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /* Write the document to a string using formatted printing ("pretty print"). This 152230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun will allocate a character array (new char[]) and return it as a pointer. The 152330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun calling code pust call delete[] on the return char* to avoid a memory leak. 152430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 152530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun //char* PrintToMemory() const; 152630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 152730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Print this Document to a FILE stream. 152830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void Print( FILE* cfile, int depth = 0 ) const; 152930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // [internal use] 153030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); 153130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 153230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 153330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. 153430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 153530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Walk the XML tree visiting this node and all of its children. 153630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 153730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Accept( TiXmlVisitor* content ) const; 153830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 153930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected : 154030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // [internal use] 154130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TiXmlNode* Clone() const; 154230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 154330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); 154430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 154530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 154630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 154730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void CopyTo( TiXmlDocument* target ) const; 154830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 154930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool error; 155030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int errorId; 155130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING errorDesc; 155230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int tabsize; 155330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlCursor errorLocation; 155430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. 155530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 155630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 155730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 155830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** 155930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun A TiXmlHandle is a class that wraps a node pointer with null checks; this is 156030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml 156130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DOM structure. It is a separate utility class. 156230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 156330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Take an example: 156430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 156530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <Document> 156630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <Element attributeA = "valueA"> 156730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <Child attributeB = "value1" /> 156830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <Child attributeB = "value2" /> 156930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun </Element> 157030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun <Document> 157130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 157230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 157330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very 157430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun easy to write a *lot* of code that looks like: 157530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 157630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 157730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* root = document.FirstChildElement( "Document" ); 157830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( root ) 157930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 158030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* element = root->FirstChildElement( "Element" ); 158130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( element ) 158230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 158330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* child = element->FirstChildElement( "Child" ); 158430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( child ) 158530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 158630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* child2 = child->NextSiblingElement( "Child" ); 158730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( child2 ) 158830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 158930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Finally do something useful. 159030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 159130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 159230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity 159330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun of such code. A TiXmlHandle checks for null pointers so it is perfectly safe 159430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun and correct to use: 159530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 159630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 159730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle docHandle( &document ); 159830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); 159930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( child2 ) 160030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 160130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // do something useful 160230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 160330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 160430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Which is MUCH more concise and useful. 160530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 160630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun It is also safe to copy handles - internally they are nothing more than node pointers. 160730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 160830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle handleCopy = handle; 160930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 161030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 161130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun What they should not be used for is iteration: 161230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 161330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 161430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int i=0; 161530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun while ( true ) 161630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 161730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); 161830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if ( !child ) 161930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun break; 162030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // do something 162130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ++i; 162230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 162330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 162430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 162530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun It seems reasonable, but it is in fact two embedded while loops. The Child method is 162630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun a linear walk to find the element, so this code would iterate much more than it needs 162730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun to. Instead, prefer: 162830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 162930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 163030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); 163130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 163230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for( child; child; child=child->NextSiblingElement() ) 163330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun { 163430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // do something 163530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 163630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 163730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 163830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlHandle 163930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 164030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 164130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. 164230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } 164330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Copy constructor 164430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } 164530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } 164630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 164730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return a handle to the first child node. 164830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle FirstChild() const; 164930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return a handle to the first child node with the given name. 165030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle FirstChild( const char * value ) const; 165130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return a handle to the first child element. 165230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle FirstChildElement() const; 165330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return a handle to the first child element with the given name. 165430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle FirstChildElement( const char * value ) const; 165530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 165630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return a handle to the "index" child with the given name. 165730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The first child is 0, the second 1, etc. 165830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 165930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle Child( const char* value, int index ) const; 166030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return a handle to the "index" child. 166130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The first child is 0, the second 1, etc. 166230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 166330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle Child( int index ) const; 166430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return a handle to the "index" child element with the given name. 166530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The first child element is 0, the second 1, etc. Note that only TiXmlElements 166630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun are indexed: other types are not counted. 166730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 166830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle ChildElement( const char* value, int index ) const; 166930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return a handle to the "index" child element. 167030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun The first child element is 0, the second 1, etc. Note that only TiXmlElements 167130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun are indexed: other types are not counted. 167230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 167330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle ChildElement( int index ) const; 167430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 167530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 167630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } 167730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } 167830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 167930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } 168030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } 168130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 168230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 168330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return the handle as a TiXmlNode. This may return null. 168430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 168530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* ToNode() const { return node; } 168630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return the handle as a TiXmlElement. This may return null. 168730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 168830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } 168930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return the handle as a TiXmlText. This may return null. 169030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 169130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } 169230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Return the handle as a TiXmlUnknown. This may return null. 169330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 169430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } 169530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 169630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** @deprecated use ToNode. 169730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Return the handle as a TiXmlNode. This may return null. 169830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 169930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* Node() const { return ToNode(); } 170030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** @deprecated use ToElement. 170130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Return the handle as a TiXmlElement. This may return null. 170230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 170330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlElement* Element() const { return ToElement(); } 170430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** @deprecated use ToText() 170530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Return the handle as a TiXmlText. This may return null. 170630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 170730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlText* Text() const { return ToText(); } 170830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** @deprecated use ToUnknown() 170930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Return the handle as a TiXmlUnknown. This may return null. 171030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 171130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlUnknown* Unknown() const { return ToUnknown(); } 171230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 171330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 171430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlNode* node; 171530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 171630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 171730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 171830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** Print to memory functionality. The TiXmlPrinter is useful when you need to: 171930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 172030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun -# Print to memory (especially in non-STL mode) 172130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun -# Control formatting (line endings, etc.) 172230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 172330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun When constructed, the TiXmlPrinter is in its default "pretty printing" mode. 172430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Before calling Accept() you can call methods to control the printing 172530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun of the XML document. After TiXmlNode::Accept() is called, the printed document can 172630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun be accessed via the CStr(), Str(), and Size() methods. 172730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 172830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlPrinter uses the Visitor API. 172930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @verbatim 173030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlPrinter printer; 173130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun printer.SetIndent( "\t" ); 173230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 173330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun doc.Accept( &printer ); 173430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf( stdout, "%s", printer.CStr() ); 173530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun @endverbatim 173630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/ 173730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlPrinter : public TiXmlVisitor 173830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{ 173930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic: 174030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), 174130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun buffer(), indent( " " ), lineBreak( "\n" ) {} 174230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 174330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitEnter( const TiXmlDocument& doc ); 174430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitExit( const TiXmlDocument& doc ); 174530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 174630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); 174730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool VisitExit( const TiXmlElement& element ); 174830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 174930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlDeclaration& declaration ); 175030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlText& text ); 175130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlComment& comment ); 175230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool Visit( const TiXmlUnknown& unknown ); 175330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 175430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Set the indent characters for printing. By default 4 spaces 175530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun but tab (\t) is also useful, or null/empty string for no indentation. 175630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 175730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } 175830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Query the indention string. 175930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* Indent() { return indent.c_str(); } 176030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Set the line breaking string. By default set to newline (\n). 176130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Some operating systems prefer other characters, or can be 176230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun set to the null/empty string for no indenation. 176330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 176430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } 176530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Query the current line breaking string. 176630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* LineBreak() { return lineBreak.c_str(); } 176730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 176830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /** Switch over to "stream printing" which is the most dense formatting without 176930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun linebreaks. Common when the XML is needed for network transmission. 177030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 177130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetStreamPrinting() { indent = ""; 177230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun lineBreak = ""; 177330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 177430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return the result. 177530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* CStr() { return buffer.c_str(); } 177630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return the length of the result string. 177730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun size_t Size() { return buffer.size(); } 177830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 177930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #ifdef TIXML_USE_STL 178030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun /// Return the result. 178130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const std::string& Str() { return buffer; } 178230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun #endif 178330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 178430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate: 178530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void DoIndent() { 178630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun for( int i=0; i<depth; ++i ) 178730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun buffer += indent; 178830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 178930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void DoLineBreak() { 179030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun buffer += lineBreak; 179130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 179230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 179330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int depth; 179430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool simpleTextPrint; 179530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING buffer; 179630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING indent; 179730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TIXML_STRING lineBreak; 179830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 179930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 180030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 180130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef _MSC_VER 180230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( pop ) 180330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 180430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 180530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif 1806