Moving string in/out into XMLUtil. Using that across the API. Supporting text queries of primitive types.
diff --git a/xmltest.cpp b/xmltest.cpp
index 760d0e2..7916a05 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -38,7 +38,7 @@
 }

 

 

-bool XMLTest( const char* testString, int expected, int found, bool echo=true )

+template< class T > bool XMLTest( const char* testString, T expected, T found, bool echo=true )

 {

 	bool pass = ( expected == found );

 	if ( pass )

@@ -116,6 +116,34 @@
 }

 

 

+bool example_4()

+{

+	static const char* xml =

+		"<information>"

+		"	<attributeApproach v='2' />"

+		"	<textApproach>"

+		"		<v>2</v>"

+		"	</textApproach>"

+		"</information>";

+	

+	XMLDocument doc;

+	doc.Parse( xml );

+

+	int v0 = 0;

+	int v1 = 0;

+

+	XMLElement* attributeApproachElement = doc.FirstChildElement()->FirstChildElement( "attributeApproach" );

+	attributeApproachElement->QueryIntAttribute( "v", &v0 );

+

+	XMLElement* textApproachElement = doc.FirstChildElement()->FirstChildElement( "textApproach" );

+	textApproachElement->FirstChildElement( "v" )->QueryIntText( &v1 );

+

+	printf( "Both values are the same: %d and %d\n", v0, v1 );

+

+	return !doc.Error() && ( v0 == v1 );

+}

+

+

 int main( int /*argc*/, const char ** /*argv*/ )

 {

 	#if defined( _MSC_VER ) && defined( DEBUG )

@@ -148,6 +176,7 @@
 	XMLTest( "Example-1", 0, example_1() );

 	XMLTest( "Example-2", 0, example_2() );

 	XMLTest( "Example-3", 0, example_3() );

+	XMLTest( "Example-4", true, example_4() );

 

 	/* ------ Example 2: Lookup information. ---- */	

 

@@ -243,7 +272,7 @@
 		XMLTest( "Programmatic DOM", true, doc->FirstChildElement()->FirstChildElement()->BoolAttribute( "attrib" ) );

 		int value = 10;

 		int result = doc->FirstChildElement()->LastChildElement()->QueryIntAttribute( "attrib", &value );

-		XMLTest( "Programmatic DOM", result, XML_NO_ATTRIBUTE );

+		XMLTest( "Programmatic DOM", result, (int)XML_NO_ATTRIBUTE );

 		XMLTest( "Programmatic DOM", value, 10 );

 

 		doc->Print();

@@ -303,7 +332,7 @@
 

 		XMLDocument doc;

 		doc.Parse( error );

-		XMLTest( "Bad XML", doc.ErrorID(), XML_ERROR_PARSING_ATTRIBUTE );

+		XMLTest( "Bad XML", doc.ErrorID(), (int)XML_ERROR_PARSING_ATTRIBUTE );

 	}

 

 	{

@@ -318,17 +347,17 @@
 		double dVal;

 

 		result = ele->QueryDoubleAttribute( "attr0", &dVal );

-		XMLTest( "Query attribute: int as double", result, XML_NO_ERROR );

+		XMLTest( "Query attribute: int as double", result, (int)XML_NO_ERROR );

 		XMLTest( "Query attribute: int as double", (int)dVal, 1 );

 		result = ele->QueryDoubleAttribute( "attr1", &dVal );

 		XMLTest( "Query attribute: double as double", (int)dVal, 2 );

 		result = ele->QueryIntAttribute( "attr1", &iVal );

-		XMLTest( "Query attribute: double as int", result, XML_NO_ERROR );

+		XMLTest( "Query attribute: double as int", result, (int)XML_NO_ERROR );

 		XMLTest( "Query attribute: double as int", iVal, 2 );

 		result = ele->QueryIntAttribute( "attr2", &iVal );

-		XMLTest( "Query attribute: not a number", result, XML_WRONG_ATTRIBUTE_TYPE );

+		XMLTest( "Query attribute: not a number", result, (int)XML_WRONG_ATTRIBUTE_TYPE );

 		result = ele->QueryIntAttribute( "bar", &iVal );

-		XMLTest( "Query attribute: does not exist", result, XML_NO_ATTRIBUTE );

+		XMLTest( "Query attribute: does not exist", result, (int)XML_NO_ATTRIBUTE );

 	}

 

 	{

@@ -566,7 +595,7 @@
 

 		XMLDocument doc;

         doc.Parse( test );

-        XMLTest( "dot in names", doc.Error(), 0);

+        XMLTest( "dot in names", doc.Error(), false );

         XMLTest( "dot in names", doc.FirstChildElement()->Name(), "a.elem" );

         XMLTest( "dot in names", doc.FirstChildElement()->Attribute( "xmi.version" ), "2.0" );

 	}

@@ -623,7 +652,7 @@
 		XMLDocument doc;

 		doc.Parse( doctype );

 		

-		XMLTest( "Parsing repeated attributes.", XML_ERROR_PARSING_ATTRIBUTE, doc.ErrorID() );	// is an  error to tinyxml (didn't use to be, but caused issues)

+		XMLTest( "Parsing repeated attributes.", (int)XML_ERROR_PARSING_ATTRIBUTE, doc.ErrorID() );	// is an  error to tinyxml (didn't use to be, but caused issues)

 		doc.PrintError();

 	}

 

@@ -641,7 +670,7 @@
 		const char* str = "    ";

 		XMLDocument doc;

 		doc.Parse( str );

-		XMLTest( "Empty document error", XML_ERROR_EMPTY_DOCUMENT, doc.ErrorID() );

+		XMLTest( "Empty document error", (int)XML_ERROR_EMPTY_DOCUMENT, doc.ErrorID() );

 	}

 

 	{

@@ -668,7 +697,7 @@
 		xml.Parse("<x> ");

 		XMLTest("Missing end tag with trailing whitespace", xml.Error(), true);

 		xml.Parse("<x></y>");

-		XMLTest("Mismatched tags", xml.ErrorID(), XML_ERROR_MISMATCHED_ELEMENT);

+		XMLTest("Mismatched tags", xml.ErrorID(), (int)XML_ERROR_MISMATCHED_ELEMENT);

 	} 

 

 

@@ -865,6 +894,40 @@
 		XMLTest( "BOM and default declaration", printer.CStr(), result, false );

 		XMLTest( "CStrSize", printer.CStrSize(), 42, false );

 	}

+	{

+		const char* xml = "<ipxml ws='1'><info bla=' /></ipxml>";

+		XMLDocument doc;

+		doc.Parse( xml );

+		XMLTest( "Ill formed XML", true, doc.Error() );

+	}

+

+	// QueryXYZText

+	{

+		const char* xml = "<point> <x>1.2</x> <y>1</y> <z>38</z> <valid>true</valid> </point>";

+		XMLDocument doc;

+		doc.Parse( xml );

+

+		const XMLElement* pointElement = doc.RootElement();

+

+		int intValue = 0;

+		unsigned unsignedValue = 0;

+		float floatValue = 0;

+		double doubleValue = 0;

+		bool boolValue = false;

+

+		pointElement->FirstChildElement( "y" )->QueryIntText( &intValue );

+		pointElement->FirstChildElement( "y" )->QueryUnsignedText( &unsignedValue );

+		pointElement->FirstChildElement( "x" )->QueryFloatText( &floatValue );

+		pointElement->FirstChildElement( "x" )->QueryDoubleText( &doubleValue );

+		pointElement->FirstChildElement( "valid" )->QueryBoolText( &boolValue );

+

+

+		XMLTest( "QueryIntText", intValue, 1,						false );

+		XMLTest( "QueryUnsignedText", unsignedValue, (unsigned)1,	false );

+		XMLTest( "QueryFloatText", floatValue, 1.2f,				false );

+		XMLTest( "QueryDoubleText", doubleValue, 1.2,				false );

+		XMLTest( "QueryBoolText", boolValue, true,					false );

+	}

 

 	

 	// ----------- Performance tracking --------------