31#if defined( DEBUG_PARSER )
32# if defined( DEBUG ) && defined( _MSC_VER )
34# define TIXML_LOG OutputDebugString
36# define TIXML_LOG printf
43TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] =
48 {
""", 6,
'\"' },
62const unsigned char TIXML_UTF_LEAD_0 = 0xefU;
63const unsigned char TIXML_UTF_LEAD_1 = 0xbbU;
64const unsigned char TIXML_UTF_LEAD_2 = 0xbfU;
66const int TiXmlBase::utf8ByteTable[256] =
69 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
70 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
71 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
72 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
73 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
74 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
75 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
76 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
77 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
78 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
79 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
80 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
81 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
84 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
88void TiXmlBase::ConvertUTF32ToUTF8(
unsigned long input,
char* output,
int* length )
90 const unsigned long BYTE_MASK = 0xBF;
91 const unsigned long BYTE_MARK = 0x80;
92 const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
96 else if ( input < 0x800 )
98 else if ( input < 0x10000 )
100 else if ( input < 0x200000 )
103 { *length = 0;
return; }
112 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
116 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
120 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
124 *output = (char)(input | FIRST_BYTE_MARK[*length]);
129 int TiXmlBase::IsAlpha(
unsigned char anyByte, TiXmlEncoding )
139 return isalpha( anyByte );
150 int TiXmlBase::IsAlphaNum(
unsigned char anyByte, TiXmlEncoding )
160 return isalnum( anyByte );
171class TiXmlParsingData
173 friend class TiXmlDocument;
175 void Stamp(
const char* now, TiXmlEncoding encoding );
177 const TiXmlCursor& Cursor() {
return cursor; }
181 TiXmlParsingData(
const char* start,
int _tabsize,
int row,
int col )
196void TiXmlParsingData::Stamp(
const char* now, TiXmlEncoding encoding )
207 int row = cursor.row;
208 int col = cursor.col;
209 const char* p = stamp;
215 const unsigned char* pU = (
const unsigned char*)p;
258 col = (col / tabsize + 1) * tabsize;
261 case TIXML_UTF_LEAD_0:
262 if ( encoding == TIXML_ENCODING_UTF8 )
264 if ( *(p+1) && *(p+2) )
268 if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 )
270 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU )
272 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )
286 if ( encoding == TIXML_ENCODING_UTF8 )
289 int step = TiXmlBase::utf8ByteTable[*((
const unsigned char*)p)];
307 assert( cursor.row >= -1 );
308 assert( cursor.col >= -1 );
314const char* TiXmlBase::SkipWhiteSpace(
const char* p, TiXmlEncoding encoding )
320 if ( encoding == TIXML_ENCODING_UTF8 )
324 const unsigned char* pU = (
const unsigned char*)p;
327 if ( *(pU+0)==TIXML_UTF_LEAD_0
328 && *(pU+1)==TIXML_UTF_LEAD_1
329 && *(pU+2)==TIXML_UTF_LEAD_2 )
334 else if(*(pU+0)==TIXML_UTF_LEAD_0
341 else if(*(pU+0)==TIXML_UTF_LEAD_0
349 if ( IsWhiteSpace( *p ) )
357 while ( *p && IsWhiteSpace( *p ) )
365 bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag )
369 if ( !in->good() )
return false;
373 if ( !IsWhiteSpace( c ) || c <= 0 )
376 *tag += (char) in->get();
380 bool TiXmlBase::StreamTo( std::istream * in,
int character, TIXML_STRING * tag )
386 if ( c == character )
401const char* TiXmlBase::ReadName(
const char* p, TIXML_STRING * name, TiXmlEncoding encoding )
417 && ( IsAlpha( (
unsigned char) *p, encoding ) || *p ==
'_' ) )
419 const char* start = p;
421 && ( IsAlphaNum( (
unsigned char ) *p, encoding )
431 name->assign( start, p-start );
438const char* TiXmlBase::GetEntity(
const char* p,
char* value,
int* length, TiXmlEncoding encoding )
445 if ( *(p+1) && *(p+1) ==
'#' && *(p+2) )
447 unsigned long ucs = 0;
454 if ( !*(p+3) )
return nullptr;
457 q = strchr( q,
';' );
459 if ( !q || !*q )
return nullptr;
466 if ( *q >=
'0' && *q <=
'9' )
467 ucs += mult * (*q -
'0');
468 else if ( *q >=
'a' && *q <=
'f' )
469 ucs += mult * (*q -
'a' + 10);
470 else if ( *q >=
'A' && *q <=
'F' )
471 ucs += mult * (*q -
'A' + 10 );
481 if ( !*(p+2) )
return nullptr;
484 q = strchr( q,
';' );
486 if ( !q || !*q )
return nullptr;
493 if ( *q >=
'0' && *q <=
'9' )
494 ucs += mult * (*q -
'0');
501 if ( encoding == TIXML_ENCODING_UTF8 )
504 ConvertUTF32ToUTF8( ucs, value, length );
511 return p + delta + 1;
515 for( i=0; i<NUM_ENTITY; ++i )
517 if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 )
519 assert( strlen( entity[i].str ) == entity[i].strLength );
520 *value = entity[i].chr;
522 return ( p + entity[i].strLength );
534bool TiXmlBase::StringEqual(
const char* p,
537 TiXmlEncoding encoding )
551 while ( *q && *tag && ToLower( *q, encoding ) == ToLower( *tag, encoding ) )
562 while ( *q && *tag && *q == *tag )
574const char* TiXmlBase::ReadText(
const char* p,
578 bool caseInsensitive,
579 TiXmlEncoding encoding )
583 || !condenseWhiteSpace )
587 && !StringEqual( p, endTag, caseInsensitive, encoding )
591 char cArr[4] = { 0, 0, 0, 0 };
592 p = GetChar( p, cArr, &len, encoding );
593 text->append( cArr, len );
598 bool whitespace =
false;
601 p = SkipWhiteSpace( p, encoding );
603 && !StringEqual( p, endTag, caseInsensitive, encoding ) )
605 if ( *p ==
'\r' || *p ==
'\n' )
610 else if ( IsWhiteSpace( *p ) )
625 char cArr[4] = { 0, 0, 0, 0 };
626 p = GetChar( p, cArr, &len, encoding );
630 text->append( cArr, len );
635 p += strlen( endTag );
641void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag )
650 if ( !StreamTo( in,
'<', tag ) )
652 SetError( TIXML_ERROR_PARSING_EMPTY,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
658 int tagIndex = (int) tag->length();
659 while ( in->good() && in->peek() !=
'>' )
664 SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
675 TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING );
679 node->StreamIn( in, tag );
680 bool isElement = node->
ToElement() !=
nullptr;
693 SetError( TIXML_ERROR,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
699 SetError( TIXML_ERROR,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
713 SetError( TIXML_ERROR_DOCUMENT_EMPTY,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
723 location.row = prevData->cursor.row;
724 location.col = prevData->cursor.col;
731 TiXmlParsingData data( p, TabSize(), location.row, location.col );
732 location = data.Cursor();
734 if ( encoding == TIXML_ENCODING_UNKNOWN )
737 const unsigned char* pU = (
const unsigned char*)p;
738 if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0
739 && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1
740 && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 )
742 encoding = TIXML_ENCODING_UTF8;
743 useMicrosoftBOM =
true;
747 p = SkipWhiteSpace( p, encoding );
750 SetError( TIXML_ERROR_DOCUMENT_EMPTY,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
756 TiXmlNode* node = Identify( p, encoding );
759 p = node->Parse( p, &data, encoding );
768 if ( encoding == TIXML_ENCODING_UNKNOWN
776 encoding = TIXML_ENCODING_UTF8;
777 else if ( StringEqual( enc,
"UTF-8",
true, TIXML_ENCODING_UNKNOWN ) )
778 encoding = TIXML_ENCODING_UTF8;
779 else if ( StringEqual( enc,
"UTF8",
true, TIXML_ENCODING_UNKNOWN ) )
780 encoding = TIXML_ENCODING_UTF8;
782 encoding = TIXML_ENCODING_LEGACY;
785 p = SkipWhiteSpace( p, encoding );
790 SetError( TIXML_ERROR_DOCUMENT_EMPTY,
nullptr,
nullptr, encoding );
798void TiXmlDocument::SetError(
int err,
const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding )
804 assert( err > 0 && err < TIXML_ERROR_STRING_COUNT );
807 errorDesc = errorString[ errorId ];
809 errorLocation.Clear();
810 if ( pError && data )
812 data->Stamp( pError, encoding );
813 errorLocation = data->Cursor();
818TiXmlNode* TiXmlNode::Identify(
const char* p, TiXmlEncoding encoding )
820 TiXmlNode* returnNode =
nullptr;
822 p = SkipWhiteSpace( p, encoding );
823 if( !p || !*p || *p !=
'<' )
828 p = SkipWhiteSpace( p, encoding );
842 const char* xmlHeader = {
"<?xml" };
843 const char* commentHeader = {
"<!--" };
844 const char* dtdHeader = {
"<!" };
845 const char* cdataHeader = {
"<![CDATA[" };
847 if ( StringEqual( p, xmlHeader,
true, encoding ) )
850 TIXML_LOG(
"XML parsing Declaration\n" );
852 returnNode =
new TiXmlDeclaration();
854 else if ( StringEqual( p, commentHeader,
false, encoding ) )
857 TIXML_LOG(
"XML parsing Comment\n" );
859 returnNode =
new TiXmlComment();
861 else if ( StringEqual( p, cdataHeader,
false, encoding ) )
864 TIXML_LOG(
"XML parsing CDATA\n" );
866 TiXmlText* text =
new TiXmlText(
"" );
870 else if ( StringEqual( p, dtdHeader,
false, encoding ) )
873 TIXML_LOG(
"XML parsing Unknown(1)\n" );
875 returnNode =
new TiXmlUnknown();
877 else if ( IsAlpha( *(p+1), encoding )
881 TIXML_LOG(
"XML parsing Element\n" );
883 returnNode =
new TiXmlElement(
"" );
888 TIXML_LOG(
"XML parsing Unknown(2)\n" );
890 returnNode =
new TiXmlUnknown();
896 returnNode->parent =
this;
903void TiXmlElement::StreamIn (std::istream * in, TIXML_STRING * tag)
914 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
923 if ( tag->length() < 3 )
return;
928 if ( tag->at( tag->length() - 1 ) ==
'>'
929 && tag->at( tag->length() - 2 ) ==
'/' )
934 else if ( tag->at( tag->length() - 1 ) ==
'>' )
943 StreamWhiteSpace( in, tag );
946 if ( in->good() && in->peek() !=
'<' )
949 TiXmlText text(
"" );
950 text.StreamIn( in, tag );
959 if ( !in->good() )
return;
960 assert( in->peek() ==
'<' );
961 int tagIndex = (int) tag->length();
963 bool closingTag =
false;
964 bool firstCharFound =
false;
976 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
987 if ( c ==
'[' && tag->size() >= 9 )
989 size_t len = tag->size();
990 const char* start = tag->c_str() + len - 9;
991 if ( strcmp( start,
"<![CDATA[" ) == 0 ) {
992 assert( !closingTag );
997 if ( !firstCharFound && c !=
'<' && !IsWhiteSpace( c ) )
999 firstCharFound =
true;
1016 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
1028 const char* tagloc = tag->c_str() + tagIndex;
1029 TiXmlNode* node = Identify( tagloc, TIXML_DEFAULT_ENCODING );
1032 node->StreamIn( in, tag );
1043const char* TiXmlElement::Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
1045 p = SkipWhiteSpace( p, encoding );
1050 if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT,
nullptr,
nullptr, encoding );
1056 data->Stamp( p, encoding );
1057 location = data->Cursor();
1062 if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, p, data, encoding );
1066 p = SkipWhiteSpace( p+1, encoding );
1069 const char* pErr = p;
1071 p = ReadName( p, &value, encoding );
1074 if ( document ) document->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, pErr, data, encoding );
1078 TIXML_STRING endTag (
"</");
1086 p = SkipWhiteSpace( p, encoding );
1089 if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding );
1098 if ( document ) document->SetError( TIXML_ERROR_PARSING_EMPTY, p, data, encoding );
1103 else if ( *p ==
'>' )
1109 p = ReadValue( p, data, encoding );
1113 if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );
1122 if ( StringEqual( p, endTag.c_str(),
false, encoding ) )
1124 p += endTag.length();
1125 p = SkipWhiteSpace( p, encoding );
1126 if ( p && *p && *p ==
'>' ) {
1130 if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );
1135 if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );
1142 TiXmlAttribute* attrib =
new TiXmlAttribute();
1148 attrib->SetDocument( document );
1150 p = attrib->Parse( p, data, encoding );
1154 if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding );
1160 #ifdef TIXML_USE_STL
1161 TiXmlAttribute* node = attributeSet.Find( attrib->NameTStr() );
1163 TiXmlAttribute* node = attributeSet.Find( attrib->
Name() );
1167 if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding );
1172 attributeSet.Add( attrib );
1179const char* TiXmlElement::ReadValue(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
1184 const char* pWithWhiteSpace = p;
1185 p = SkipWhiteSpace( p, encoding );
1192 TiXmlText* textNode =
new TiXmlText(
"" );
1201 p = textNode->Parse( p, data, encoding );
1207 p = textNode->Parse( pWithWhiteSpace, data, encoding );
1210 if ( !textNode->Blank() )
1220 if ( StringEqual( p,
"</",
false, encoding ) )
1226 TiXmlNode* node = Identify( p, encoding );
1229 p = node->Parse( p, data, encoding );
1238 pWithWhiteSpace = p;
1239 p = SkipWhiteSpace( p, encoding );
1244 if ( document ) document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE,
nullptr,
nullptr, encoding );
1251void TiXmlUnknown::StreamIn( std::istream * in, TIXML_STRING * tag )
1253 while ( in->good() )
1260 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
1275const char* TiXmlUnknown::Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
1278 p = SkipWhiteSpace( p, encoding );
1282 data->Stamp( p, encoding );
1283 location = data->Cursor();
1285 if ( !p || !*p || *p !=
'<' )
1287 if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, p, data, encoding );
1293 while ( p && *p && *p !=
'>' )
1301 if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN,
nullptr,
nullptr, encoding );
1309void TiXmlComment::StreamIn( std::istream * in, TIXML_STRING * tag )
1311 while ( in->good() )
1318 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
1325 && tag->at( tag->length() - 2 ) ==
'-'
1326 && tag->at( tag->length() - 3 ) ==
'-' )
1336const char* TiXmlComment::Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
1341 p = SkipWhiteSpace( p, encoding );
1345 data->Stamp( p, encoding );
1346 location = data->Cursor();
1348 const char* startTag =
"<!--";
1349 const char* endTag =
"-->";
1351 if ( !StringEqual( p, startTag,
false, encoding ) )
1353 document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding );
1356 p += strlen( startTag );
1378 while ( p && *p && !StringEqual( p, endTag,
false, encoding ) )
1380 value.append( p, 1 );
1384 p += strlen( endTag );
1390const char* TiXmlAttribute::Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
1392 p = SkipWhiteSpace( p, encoding );
1393 if ( !p || !*p )
return nullptr;
1397 data->Stamp( p, encoding );
1398 location = data->Cursor();
1401 const char* pErr = p;
1402 p = ReadName( p, &name, encoding );
1405 if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding );
1408 p = SkipWhiteSpace( p, encoding );
1409 if ( !p || !*p || *p !=
'=' )
1411 if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );
1416 p = SkipWhiteSpace( p, encoding );
1419 if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );
1424 const char SINGLE_QUOTE =
'\'';
1425 const char DOUBLE_QUOTE =
'\"';
1427 if ( *p == SINGLE_QUOTE )
1431 p = ReadText( p, &value,
false, end,
false, encoding );
1433 else if ( *p == DOUBLE_QUOTE )
1437 p = ReadText( p, &value,
false, end,
false, encoding );
1446 && !IsWhiteSpace( *p )
1447 && *p !=
'/' && *p !=
'>' )
1449 if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) {
1453 if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );
1464void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag )
1466 while ( in->good() )
1469 if ( !cdata && (c ==
'<' ) )
1477 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
1484 if ( cdata && c ==
'>' && tag->size() >= 3 ) {
1485 size_t len = tag->size();
1486 if ( (*tag)[len-2] ==
']' && (*tag)[len-3] ==
']' ) {
1495const char* TiXmlText::Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
1502 data->Stamp( p, encoding );
1503 location = data->Cursor();
1506 const char*
const startTag =
"<![CDATA[";
1507 const char*
const endTag =
"]]>";
1509 if ( cdata || StringEqual( p, startTag,
false, encoding ) )
1513 if ( !StringEqual( p, startTag,
false, encoding ) )
1515 document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding );
1518 p += strlen( startTag );
1522 && !StringEqual( p, endTag,
false, encoding )
1530 p = ReadText( p, &dummy,
false, endTag,
false, encoding );
1535 bool ignoreWhite =
true;
1537 const char* end =
"<";
1538 p = ReadText( p, &value, ignoreWhite, end,
false, encoding );
1546void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag )
1548 while ( in->good() )
1555 document->SetError( TIXML_ERROR_EMBEDDED_NULL,
nullptr,
nullptr, TIXML_ENCODING_UNKNOWN );
1569const char* TiXmlDeclaration::Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding )
1571 p = SkipWhiteSpace( p, _encoding );
1575 if ( !p || !*p || !StringEqual( p,
"<?xml",
true, _encoding ) )
1577 if ( document ) document->SetError( TIXML_ERROR_PARSING_DECLARATION,
nullptr,
nullptr, _encoding );
1582 data->Stamp( p, _encoding );
1583 location = data->Cursor();
1599 p = SkipWhiteSpace( p, _encoding );
1600 if ( StringEqual( p,
"version",
true, _encoding ) )
1602 TiXmlAttribute attrib;
1603 p = attrib.Parse( p, data, _encoding );
1604 version = attrib.
Value();
1606 else if ( StringEqual( p,
"encoding",
true, _encoding ) )
1608 TiXmlAttribute attrib;
1609 p = attrib.Parse( p, data, _encoding );
1610 encoding = attrib.
Value();
1612 else if ( StringEqual( p,
"standalone",
true, _encoding ) )
1614 TiXmlAttribute attrib;
1615 p = attrib.Parse( p, data, _encoding );
1616 standalone = attrib.
Value();
1621 while( p && *p && *p !=
'>' && !IsWhiteSpace( *p ) )
1628bool TiXmlText::Blank()
const
1630 for (
unsigned i=0; i<value.length(); i++ )
1631 if ( !IsWhiteSpace( value[i] ) )
const char * Value() const
Return the value of this attribute.
const char * Name() const
Return the name of this attribute.
static bool IsWhiteSpaceCondensed()
Return the current white space setting.
In correct XML the declaration is the first entry in the file.
const char * Encoding() const
Encoding. Will return an empty string if none was found.
virtual const char * Parse(const char *p, TiXmlParsingData *data=0, TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)
Parse the given null terminated block of xml data.
void ClearError()
If you have handled the error, it can be reset with this call.
The parent class for everything in the Document Object Model.
TiXmlNode * LinkEndChild(TiXmlNode *addThis)
Add a new node related to this.
virtual const TiXmlDeclaration * ToDeclaration() const
Cast to a more defined type. Will return null if not of the requested type.
virtual const TiXmlElement * ToElement() const
Cast to a more defined type. Will return null if not of the requested type.
const TiXmlDocument * GetDocument() const
Return a pointer to the Document this node lives in.
void SetCDATA(bool _cdata)
Turns on or off a CDATA representation of text.