mirror of https://github.com/AxioDL/tinyxml2.git
Merge branch 'master' of https://github.com/gamaral/tinyxml2
This commit is contained in:
commit
d7e033ec0c
|
@ -0,0 +1,4 @@
|
||||||
|
all: xmltest
|
||||||
|
xmltest: xmltest.cpp tinyxml2.cpp tinyxml2.h
|
||||||
|
clean:
|
||||||
|
rm -f *.o xmltest
|
51
tinyxml2.cpp
51
tinyxml2.cpp
|
@ -23,13 +23,10 @@ distribution.
|
||||||
|
|
||||||
#include "tinyxml2.h"
|
#include "tinyxml2.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <cstdarg>
|
||||||
#include <stdlib.h>
|
#include <cstdio>
|
||||||
#include <stdio.h>
|
#include <cstdlib>
|
||||||
#include <ctype.h>
|
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
|
|
||||||
using namespace tinyxml2;
|
using namespace tinyxml2;
|
||||||
|
|
||||||
|
@ -684,7 +681,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEnd )
|
||||||
DELETE_NODE( node );
|
DELETE_NODE( node );
|
||||||
node = 0;
|
node = 0;
|
||||||
if ( !document->Error() ) {
|
if ( !document->Error() ) {
|
||||||
document->SetError( ERROR_PARSING, 0, 0 );
|
document->SetError( XML_ERROR_PARSING, 0, 0 );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -703,16 +700,16 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEnd )
|
||||||
XMLElement* ele = node->ToElement();
|
XMLElement* ele = node->ToElement();
|
||||||
if ( ele ) {
|
if ( ele ) {
|
||||||
if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) {
|
if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) {
|
||||||
document->SetError( ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
|
document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
|
||||||
p = 0;
|
p = 0;
|
||||||
}
|
}
|
||||||
else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) {
|
else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) {
|
||||||
document->SetError( ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
|
document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
|
||||||
p = 0;
|
p = 0;
|
||||||
}
|
}
|
||||||
else if ( !endTag.Empty() ) {
|
else if ( !endTag.Empty() ) {
|
||||||
if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) {
|
if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) {
|
||||||
document->SetError( ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
|
document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
|
||||||
p = 0;
|
p = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -735,14 +732,14 @@ char* XMLText::ParseDeep( char* p, StrPair* )
|
||||||
if ( this->CData() ) {
|
if ( this->CData() ) {
|
||||||
p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
|
p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
|
||||||
if ( !p ) {
|
if ( !p ) {
|
||||||
document->SetError( ERROR_PARSING_CDATA, start, 0 );
|
document->SetError( XML_ERROR_PARSING_CDATA, start, 0 );
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p = value.ParseText( p, "<", document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES );
|
p = value.ParseText( p, "<", document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES );
|
||||||
if ( !p ) {
|
if ( !p ) {
|
||||||
document->SetError( ERROR_PARSING_TEXT, start, 0 );
|
document->SetError( XML_ERROR_PARSING_TEXT, start, 0 );
|
||||||
}
|
}
|
||||||
if ( p && *p ) {
|
if ( p && *p ) {
|
||||||
return p-1;
|
return p-1;
|
||||||
|
@ -794,7 +791,7 @@ char* XMLComment::ParseDeep( char* p, StrPair* )
|
||||||
const char* start = p;
|
const char* start = p;
|
||||||
p = value.ParseText( p, "-->", StrPair::COMMENT );
|
p = value.ParseText( p, "-->", StrPair::COMMENT );
|
||||||
if ( p == 0 ) {
|
if ( p == 0 ) {
|
||||||
document->SetError( ERROR_PARSING_COMMENT, start, 0 );
|
document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 );
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
@ -841,7 +838,7 @@ char* XMLDeclaration::ParseDeep( char* p, StrPair* )
|
||||||
const char* start = p;
|
const char* start = p;
|
||||||
p = value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
|
p = value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
|
||||||
if ( p == 0 ) {
|
if ( p == 0 ) {
|
||||||
document->SetError( ERROR_PARSING_DECLARATION, start, 0 );
|
document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 );
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
@ -888,7 +885,7 @@ char* XMLUnknown::ParseDeep( char* p, StrPair* )
|
||||||
|
|
||||||
p = value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
|
p = value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
|
||||||
if ( !p ) {
|
if ( !p ) {
|
||||||
document->SetError( ERROR_PARSING_UNKNOWN, start, 0 );
|
document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 );
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
@ -939,7 +936,7 @@ int XMLAttribute::QueryIntValue( int* value ) const
|
||||||
{
|
{
|
||||||
if ( TIXML_SSCANF( Value(), "%d", value ) == 1 )
|
if ( TIXML_SSCANF( Value(), "%d", value ) == 1 )
|
||||||
return XML_NO_ERROR;
|
return XML_NO_ERROR;
|
||||||
return WRONG_ATTRIBUTE_TYPE;
|
return XML_WRONG_ATTRIBUTE_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -947,7 +944,7 @@ int XMLAttribute::QueryUnsignedValue( unsigned int* value ) const
|
||||||
{
|
{
|
||||||
if ( TIXML_SSCANF( Value(), "%u", value ) == 1 )
|
if ( TIXML_SSCANF( Value(), "%u", value ) == 1 )
|
||||||
return XML_NO_ERROR;
|
return XML_NO_ERROR;
|
||||||
return WRONG_ATTRIBUTE_TYPE;
|
return XML_WRONG_ATTRIBUTE_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -964,7 +961,7 @@ int XMLAttribute::QueryBoolValue( bool* value ) const
|
||||||
*value = false;
|
*value = false;
|
||||||
return XML_NO_ERROR;
|
return XML_NO_ERROR;
|
||||||
}
|
}
|
||||||
return WRONG_ATTRIBUTE_TYPE;
|
return XML_WRONG_ATTRIBUTE_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -972,7 +969,7 @@ int XMLAttribute::QueryDoubleValue( double* value ) const
|
||||||
{
|
{
|
||||||
if ( TIXML_SSCANF( Value(), "%lf", value ) == 1 )
|
if ( TIXML_SSCANF( Value(), "%lf", value ) == 1 )
|
||||||
return XML_NO_ERROR;
|
return XML_NO_ERROR;
|
||||||
return WRONG_ATTRIBUTE_TYPE;
|
return XML_WRONG_ATTRIBUTE_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -980,7 +977,7 @@ int XMLAttribute::QueryFloatValue( float* value ) const
|
||||||
{
|
{
|
||||||
if ( TIXML_SSCANF( Value(), "%f", value ) == 1 )
|
if ( TIXML_SSCANF( Value(), "%f", value ) == 1 )
|
||||||
return XML_NO_ERROR;
|
return XML_NO_ERROR;
|
||||||
return WRONG_ATTRIBUTE_TYPE;
|
return XML_WRONG_ATTRIBUTE_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1132,7 +1129,7 @@ char* XMLElement::ParseAttributes( char* p )
|
||||||
while( p ) {
|
while( p ) {
|
||||||
p = XMLUtil::SkipWhiteSpace( p );
|
p = XMLUtil::SkipWhiteSpace( p );
|
||||||
if ( !p || !(*p) ) {
|
if ( !p || !(*p) ) {
|
||||||
document->SetError( ERROR_PARSING_ELEMENT, start, Name() );
|
document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1144,7 +1141,7 @@ char* XMLElement::ParseAttributes( char* p )
|
||||||
p = attrib->ParseDeep( p, document->ProcessEntities() );
|
p = attrib->ParseDeep( p, document->ProcessEntities() );
|
||||||
if ( !p || Attribute( attrib->Name() ) ) {
|
if ( !p || Attribute( attrib->Name() ) ) {
|
||||||
DELETE_ATTRIBUTE( attrib );
|
DELETE_ATTRIBUTE( attrib );
|
||||||
document->SetError( ERROR_PARSING_ATTRIBUTE, start, p );
|
document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
LinkAttribute( attrib );
|
LinkAttribute( attrib );
|
||||||
|
@ -1160,7 +1157,7 @@ char* XMLElement::ParseAttributes( char* p )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
document->SetError( ERROR_PARSING_ELEMENT, start, p );
|
document->SetError( XML_ERROR_PARSING_ELEMENT, start, p );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1353,7 +1350,7 @@ int XMLDocument::LoadFile( const char* filename )
|
||||||
#pragma warning ( pop )
|
#pragma warning ( pop )
|
||||||
#endif
|
#endif
|
||||||
if ( !fp ) {
|
if ( !fp ) {
|
||||||
SetError( ERROR_FILE_NOT_FOUND, filename, 0 );
|
SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 );
|
||||||
return errorID;
|
return errorID;
|
||||||
}
|
}
|
||||||
LoadFile( fp );
|
LoadFile( fp );
|
||||||
|
@ -1383,7 +1380,7 @@ int XMLDocument::LoadFile( FILE* fp )
|
||||||
p = XMLUtil::SkipWhiteSpace( p );
|
p = XMLUtil::SkipWhiteSpace( p );
|
||||||
p = XMLUtil::ReadBOM( p, &writeBOM );
|
p = XMLUtil::ReadBOM( p, &writeBOM );
|
||||||
if ( !p || !*p ) {
|
if ( !p || !*p ) {
|
||||||
SetError( ERROR_EMPTY_DOCUMENT, 0, 0 );
|
SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
|
||||||
return errorID;
|
return errorID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1414,13 +1411,13 @@ int XMLDocument::Parse( const char* p )
|
||||||
InitDocument();
|
InitDocument();
|
||||||
|
|
||||||
if ( !p || !*p ) {
|
if ( !p || !*p ) {
|
||||||
SetError( ERROR_EMPTY_DOCUMENT, 0, 0 );
|
SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
|
||||||
return errorID;
|
return errorID;
|
||||||
}
|
}
|
||||||
p = XMLUtil::SkipWhiteSpace( p );
|
p = XMLUtil::SkipWhiteSpace( p );
|
||||||
p = XMLUtil::ReadBOM( p, &writeBOM );
|
p = XMLUtil::ReadBOM( p, &writeBOM );
|
||||||
if ( !p || !*p ) {
|
if ( !p || !*p ) {
|
||||||
SetError( ERROR_EMPTY_DOCUMENT, 0, 0 );
|
SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
|
||||||
return errorID;
|
return errorID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
79
tinyxml2.h
79
tinyxml2.h
|
@ -24,11 +24,13 @@ distribution.
|
||||||
#ifndef TINYXML2_INCLUDED
|
#ifndef TINYXML2_INCLUDED
|
||||||
#define TINYXML2_INCLUDED
|
#define TINYXML2_INCLUDED
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
#include <limits.h>
|
#include <climits>
|
||||||
#include <ctype.h>
|
#include <cstdio>
|
||||||
#include <stdio.h>
|
#include <cstring>
|
||||||
#include <memory.h> // Needed by mac.
|
#if __APPLE__
|
||||||
|
# include <memory.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: add 'lastAttribute' for faster parsing.
|
TODO: add 'lastAttribute' for faster parsing.
|
||||||
|
@ -36,7 +38,6 @@ distribution.
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
gcc: g++ -Wall tinyxml2.cpp xmltest.cpp -o gccxmltest.exe
|
gcc: g++ -Wall tinyxml2.cpp xmltest.cpp -o gccxmltest.exe
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined( _DEBUG ) || defined( DEBUG ) || defined (__DEBUG__)
|
#if defined( _DEBUG ) || defined( DEBUG ) || defined (__DEBUG__)
|
||||||
|
@ -120,15 +121,15 @@ public:
|
||||||
ATTRIBUTE_NAME = 0,
|
ATTRIBUTE_NAME = 0,
|
||||||
ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION,
|
ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION,
|
||||||
ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION,
|
ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION,
|
||||||
COMMENT = NEEDS_NEWLINE_NORMALIZATION,
|
COMMENT = NEEDS_NEWLINE_NORMALIZATION
|
||||||
};
|
};
|
||||||
|
|
||||||
StrPair() : flags( 0 ), start( 0 ), end( 0 ) {}
|
StrPair() : flags( 0 ), start( 0 ), end( 0 ) {}
|
||||||
~StrPair();
|
~StrPair();
|
||||||
|
|
||||||
void Set( char* start, char* end, int flags ) {
|
void Set( char* start_, char* end_, int flags_ ) {
|
||||||
Reset();
|
Reset();
|
||||||
this->start = start; this->end = end; this->flags = flags | NEEDS_FLUSH;
|
this->start = start_; this->end = end_; this->flags = flags_ | NEEDS_FLUSH;
|
||||||
}
|
}
|
||||||
const char* GetStr();
|
const char* GetStr();
|
||||||
bool Empty() const { return start == end; }
|
bool Empty() const { return start == end; }
|
||||||
|
@ -381,7 +382,7 @@ public:
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
inline static int IsUTF8Continuation( unsigned char p ) { return p & 0x80; }
|
inline static int IsUTF8Continuation( const char p ) { return p & 0x80; }
|
||||||
inline static int IsAlphaNum( unsigned char anyByte ) { return ( anyByte < 128 ) ? isalnum( anyByte ) : 1; }
|
inline static int IsAlphaNum( unsigned char anyByte ) { return ( anyByte < 128 ) ? isalnum( anyByte ) : 1; }
|
||||||
inline static int IsAlpha( unsigned char anyByte ) { return ( anyByte < 128 ) ? isalpha( anyByte ) : 1; }
|
inline static int IsAlpha( unsigned char anyByte ) { return ( anyByte < 128 ) ? isalpha( anyByte ) : 1; }
|
||||||
|
|
||||||
|
@ -472,7 +473,7 @@ public:
|
||||||
element with the specified name.
|
element with the specified name.
|
||||||
*/
|
*/
|
||||||
const XMLElement* FirstChildElement( const char* value=0 ) const;
|
const XMLElement* FirstChildElement( const char* value=0 ) const;
|
||||||
XMLElement* FirstChildElement( const char* value=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->FirstChildElement( value )); }
|
XMLElement* FirstChildElement( const char* value_=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->FirstChildElement( value_ )); }
|
||||||
|
|
||||||
/// Get the last child node, or null if none exists.
|
/// Get the last child node, or null if none exists.
|
||||||
const XMLNode* LastChild() const { return lastChild; }
|
const XMLNode* LastChild() const { return lastChild; }
|
||||||
|
@ -482,7 +483,7 @@ public:
|
||||||
element with the specified name.
|
element with the specified name.
|
||||||
*/
|
*/
|
||||||
const XMLElement* LastChildElement( const char* value=0 ) const;
|
const XMLElement* LastChildElement( const char* value=0 ) const;
|
||||||
XMLElement* LastChildElement( const char* value=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->LastChildElement(value) ); }
|
XMLElement* LastChildElement( const char* value_=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->LastChildElement(value_) ); }
|
||||||
|
|
||||||
/// Get the previous (left) sibling node of this node.
|
/// Get the previous (left) sibling node of this node.
|
||||||
const XMLNode* PreviousSibling() const { return prev; }
|
const XMLNode* PreviousSibling() const { return prev; }
|
||||||
|
@ -490,7 +491,7 @@ public:
|
||||||
|
|
||||||
/// Get the previous (left) sibling element of this node, with an opitionally supplied name.
|
/// Get the previous (left) sibling element of this node, with an opitionally supplied name.
|
||||||
const XMLElement* PreviousSiblingElement( const char* value=0 ) const ;
|
const XMLElement* PreviousSiblingElement( const char* value=0 ) const ;
|
||||||
XMLElement* PreviousSiblingElement( const char* value=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->PreviousSiblingElement( value ) ); }
|
XMLElement* PreviousSiblingElement( const char* value_=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->PreviousSiblingElement( value_ ) ); }
|
||||||
|
|
||||||
/// Get the next (right) sibling node of this node.
|
/// Get the next (right) sibling node of this node.
|
||||||
const XMLNode* NextSibling() const { return next; }
|
const XMLNode* NextSibling() const { return next; }
|
||||||
|
@ -498,7 +499,7 @@ public:
|
||||||
|
|
||||||
/// Get the next (right) sibling element of this node, with an opitionally supplied name.
|
/// Get the next (right) sibling element of this node, with an opitionally supplied name.
|
||||||
const XMLElement* NextSiblingElement( const char* value=0 ) const;
|
const XMLElement* NextSiblingElement( const char* value=0 ) const;
|
||||||
XMLElement* NextSiblingElement( const char* value=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->NextSiblingElement( value ) ); }
|
XMLElement* NextSiblingElement( const char* value_=0 ) { return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->NextSiblingElement( value_ ) ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add a child node as the last (right) child.
|
Add a child node as the last (right) child.
|
||||||
|
@ -616,7 +617,7 @@ public:
|
||||||
virtual const XMLText* ToText() const { return this; }
|
virtual const XMLText* ToText() const { return this; }
|
||||||
|
|
||||||
/// Declare whether this should be CDATA or standard text.
|
/// Declare whether this should be CDATA or standard text.
|
||||||
void SetCData( bool isCData ) { this->isCData = isCData; }
|
void SetCData( bool isCData_ ) { this->isCData = isCData_; }
|
||||||
/// Returns true if this is a CDATA text element.
|
/// Returns true if this is a CDATA text element.
|
||||||
bool CData() const { return isCData; }
|
bool CData() const { return isCData; }
|
||||||
|
|
||||||
|
@ -724,22 +725,22 @@ enum {
|
||||||
XML_NO_ERROR = 0,
|
XML_NO_ERROR = 0,
|
||||||
XML_SUCCESS = 0,
|
XML_SUCCESS = 0,
|
||||||
|
|
||||||
NO_ATTRIBUTE,
|
XML_NO_ATTRIBUTE,
|
||||||
WRONG_ATTRIBUTE_TYPE,
|
XML_WRONG_ATTRIBUTE_TYPE,
|
||||||
|
|
||||||
ERROR_FILE_NOT_FOUND,
|
XML_ERROR_FILE_NOT_FOUND,
|
||||||
ERROR_ELEMENT_MISMATCH,
|
XML_ERROR_ELEMENT_MISMATCH,
|
||||||
ERROR_PARSING_ELEMENT,
|
XML_ERROR_PARSING_ELEMENT,
|
||||||
ERROR_PARSING_ATTRIBUTE,
|
XML_ERROR_PARSING_ATTRIBUTE,
|
||||||
ERROR_IDENTIFYING_TAG,
|
XML_ERROR_IDENTIFYING_TAG,
|
||||||
ERROR_PARSING_TEXT,
|
XML_ERROR_PARSING_TEXT,
|
||||||
ERROR_PARSING_CDATA,
|
XML_ERROR_PARSING_CDATA,
|
||||||
ERROR_PARSING_COMMENT,
|
XML_ERROR_PARSING_COMMENT,
|
||||||
ERROR_PARSING_DECLARATION,
|
XML_ERROR_PARSING_DECLARATION,
|
||||||
ERROR_PARSING_UNKNOWN,
|
XML_ERROR_PARSING_UNKNOWN,
|
||||||
ERROR_EMPTY_DOCUMENT,
|
XML_ERROR_EMPTY_DOCUMENT,
|
||||||
ERROR_MISMATCHED_ELEMENT,
|
XML_ERROR_MISMATCHED_ELEMENT,
|
||||||
ERROR_PARSING
|
XML_ERROR_PARSING
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -773,7 +774,7 @@ public:
|
||||||
|
|
||||||
/** QueryIntAttribute interprets the attribute as an integer, and returns the value
|
/** QueryIntAttribute interprets the attribute as an integer, and returns the value
|
||||||
in the provided paremeter. The function will return XML_NO_ERROR on success,
|
in the provided paremeter. The function will return XML_NO_ERROR on success,
|
||||||
and WRONG_ATTRIBUTE_TYPE if the conversion is not successful.
|
and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful.
|
||||||
*/
|
*/
|
||||||
int QueryIntValue( int* value ) const;
|
int QueryIntValue( int* value ) const;
|
||||||
/// See QueryIntAttribute
|
/// See QueryIntAttribute
|
||||||
|
@ -855,8 +856,8 @@ public:
|
||||||
float FloatAttribute( const char* name ) const { float f=0; QueryFloatAttribute( name, &f ); return f; }
|
float FloatAttribute( const char* name ) const { float f=0; QueryFloatAttribute( name, &f ); return f; }
|
||||||
|
|
||||||
/** Given an attribute name, QueryIntAttribute() returns
|
/** Given an attribute name, QueryIntAttribute() returns
|
||||||
XML_NO_ERROR, WRONG_ATTRIBUTE_TYPE if the conversion
|
XML_NO_ERROR, XML_WRONG_ATTRIBUTE_TYPE if the conversion
|
||||||
can't be performed, or NO_ATTRIBUTE if the attribute
|
can't be performed, or XML_NO_ATTRIBUTE if the attribute
|
||||||
doesn't exist. If successful, the result of the conversion
|
doesn't exist. If successful, the result of the conversion
|
||||||
will be written to 'value'. If not successful, nothing will
|
will be written to 'value'. If not successful, nothing will
|
||||||
be written to 'value'. This allows you to provide default
|
be written to 'value'. This allows you to provide default
|
||||||
|
@ -867,15 +868,15 @@ public:
|
||||||
QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10
|
QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10
|
||||||
@endverbatim
|
@endverbatim
|
||||||
*/
|
*/
|
||||||
int QueryIntAttribute( const char* name, int* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return NO_ATTRIBUTE; return a->QueryIntValue( value ); }
|
int QueryIntAttribute( const char* name, int* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return XML_NO_ATTRIBUTE; return a->QueryIntValue( value ); }
|
||||||
/// See QueryIntAttribute()
|
/// See QueryIntAttribute()
|
||||||
int QueryUnsignedAttribute( const char* name, unsigned int* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return NO_ATTRIBUTE; return a->QueryUnsignedValue( value ); }
|
int QueryUnsignedAttribute( const char* name, unsigned int* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return XML_NO_ATTRIBUTE; return a->QueryUnsignedValue( value ); }
|
||||||
/// See QueryIntAttribute()
|
/// See QueryIntAttribute()
|
||||||
int QueryBoolAttribute( const char* name, bool* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return NO_ATTRIBUTE; return a->QueryBoolValue( value ); }
|
int QueryBoolAttribute( const char* name, bool* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return XML_NO_ATTRIBUTE; return a->QueryBoolValue( value ); }
|
||||||
/// See QueryIntAttribute()
|
/// See QueryIntAttribute()
|
||||||
int QueryDoubleAttribute( const char* name, double* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return NO_ATTRIBUTE; return a->QueryDoubleValue( value ); }
|
int QueryDoubleAttribute( const char* name, double* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return XML_NO_ATTRIBUTE; return a->QueryDoubleValue( value ); }
|
||||||
/// See QueryIntAttribute()
|
/// See QueryIntAttribute()
|
||||||
int QueryFloatAttribute( const char* name, float* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return NO_ATTRIBUTE; return a->QueryFloatValue( value ); }
|
int QueryFloatAttribute( const char* name, float* value ) const { const XMLAttribute* a = FindAttribute( name ); if ( !a ) return XML_NO_ATTRIBUTE; return a->QueryFloatValue( value ); }
|
||||||
|
|
||||||
/// Sets the named attribute to value.
|
/// Sets the named attribute to value.
|
||||||
void SetAttribute( const char* name, const char* value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); }
|
void SetAttribute( const char* name, const char* value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); }
|
||||||
|
@ -1219,7 +1220,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
}; // tinyxml2
|
} // tinyxml2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
25
xmltest.cpp
25
xmltest.cpp
|
@ -1,9 +1,8 @@
|
||||||
#include "tinyxml2.h"
|
#include "tinyxml2.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdlib>
|
||||||
#include <stdlib.h>
|
#include <cstring>
|
||||||
#include <string.h>
|
#include <ctime>
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#if defined( _MSC_VER )
|
#if defined( _MSC_VER )
|
||||||
#include <crtdbg.h>
|
#include <crtdbg.h>
|
||||||
|
@ -72,7 +71,7 @@ void NullLineEndings( char* p )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main( int /*argc*/, const char* /*argv*/ )
|
int main( int /*argc*/, const char ** /*argv*/ )
|
||||||
{
|
{
|
||||||
#if defined( _MSC_VER ) && defined( DEBUG )
|
#if defined( _MSC_VER ) && defined( DEBUG )
|
||||||
_CrtMemCheckpoint( &startMemState );
|
_CrtMemCheckpoint( &startMemState );
|
||||||
|
@ -196,7 +195,7 @@ int main( int /*argc*/, const char* /*argv*/ )
|
||||||
XMLTest( "Programmatic DOM", true, doc->FirstChildElement()->FirstChildElement()->BoolAttribute( "attrib" ) );
|
XMLTest( "Programmatic DOM", true, doc->FirstChildElement()->FirstChildElement()->BoolAttribute( "attrib" ) );
|
||||||
int value = 10;
|
int value = 10;
|
||||||
int result = doc->FirstChildElement()->LastChildElement()->QueryIntAttribute( "attrib", &value );
|
int result = doc->FirstChildElement()->LastChildElement()->QueryIntAttribute( "attrib", &value );
|
||||||
XMLTest( "Programmatic DOM", result, NO_ATTRIBUTE );
|
XMLTest( "Programmatic DOM", result, XML_NO_ATTRIBUTE );
|
||||||
XMLTest( "Programmatic DOM", value, 10 );
|
XMLTest( "Programmatic DOM", value, 10 );
|
||||||
|
|
||||||
doc->Print();
|
doc->Print();
|
||||||
|
@ -250,7 +249,7 @@ int main( int /*argc*/, const char* /*argv*/ )
|
||||||
|
|
||||||
XMLDocument doc;
|
XMLDocument doc;
|
||||||
doc.Parse( error );
|
doc.Parse( error );
|
||||||
XMLTest( "Bad XML", doc.ErrorID(), ERROR_PARSING_ATTRIBUTE );
|
XMLTest( "Bad XML", doc.ErrorID(), XML_ERROR_PARSING_ATTRIBUTE );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -273,9 +272,9 @@ int main( int /*argc*/, const char* /*argv*/ )
|
||||||
XMLTest( "Query attribute: double as int", result, XML_NO_ERROR );
|
XMLTest( "Query attribute: double as int", result, XML_NO_ERROR );
|
||||||
XMLTest( "Query attribute: double as int", iVal, 2 );
|
XMLTest( "Query attribute: double as int", iVal, 2 );
|
||||||
result = ele->QueryIntAttribute( "attr2", &iVal );
|
result = ele->QueryIntAttribute( "attr2", &iVal );
|
||||||
XMLTest( "Query attribute: not a number", result, WRONG_ATTRIBUTE_TYPE );
|
XMLTest( "Query attribute: not a number", result, XML_WRONG_ATTRIBUTE_TYPE );
|
||||||
result = ele->QueryIntAttribute( "bar", &iVal );
|
result = ele->QueryIntAttribute( "bar", &iVal );
|
||||||
XMLTest( "Query attribute: does not exist", result, NO_ATTRIBUTE );
|
XMLTest( "Query attribute: does not exist", result, XML_NO_ATTRIBUTE );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -569,7 +568,7 @@ int main( int /*argc*/, const char* /*argv*/ )
|
||||||
XMLDocument doc;
|
XMLDocument doc;
|
||||||
doc.Parse( doctype );
|
doc.Parse( doctype );
|
||||||
|
|
||||||
XMLTest( "Parsing repeated attributes.", ERROR_PARSING_ATTRIBUTE, doc.ErrorID() ); // is an error to tinyxml (didn't use to be, but caused issues)
|
XMLTest( "Parsing repeated attributes.", XML_ERROR_PARSING_ATTRIBUTE, doc.ErrorID() ); // is an error to tinyxml (didn't use to be, but caused issues)
|
||||||
doc.PrintError();
|
doc.PrintError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -583,11 +582,11 @@ int main( int /*argc*/, const char* /*argv*/ )
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// Empty documents should return TIXML_ERROR_PARSING_EMPTY, bug 1070717
|
// Empty documents should return TIXML_XML_ERROR_PARSING_EMPTY, bug 1070717
|
||||||
const char* str = " ";
|
const char* str = " ";
|
||||||
XMLDocument doc;
|
XMLDocument doc;
|
||||||
doc.Parse( str );
|
doc.Parse( str );
|
||||||
XMLTest( "Empty document error", ERROR_EMPTY_DOCUMENT, doc.ErrorID() );
|
XMLTest( "Empty document error", XML_ERROR_EMPTY_DOCUMENT, doc.ErrorID() );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -614,7 +613,7 @@ int main( int /*argc*/, const char* /*argv*/ )
|
||||||
xml.Parse("<x> ");
|
xml.Parse("<x> ");
|
||||||
XMLTest("Missing end tag with trailing whitespace", xml.Error(), true);
|
XMLTest("Missing end tag with trailing whitespace", xml.Error(), true);
|
||||||
xml.Parse("<x></y>");
|
xml.Parse("<x></y>");
|
||||||
XMLTest("Mismatched tags", xml.ErrorID(), ERROR_MISMATCHED_ELEMENT);
|
XMLTest("Mismatched tags", xml.ErrorID(), XML_ERROR_MISMATCHED_ELEMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue