support IntText(),UnsignedText(),Int64Text() for hex value
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 6b79917..d0479ba 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -596,7 +596,7 @@
 

 bool XMLUtil::ToInt( const char* str, int* value )

 {

-    if ( TIXML_SSCANF( str, "%d", value ) == 1 ) {

+    if ( TIXML_SSCANF( str, IsPrefixHex(str) ? "%x" : "%d", value ) == 1 ) {

         return true;

     }

     return false;

@@ -604,7 +604,7 @@
 

 bool XMLUtil::ToUnsigned( const char* str, unsigned *value )

 {

-    if ( TIXML_SSCANF( str, "%u", value ) == 1 ) {

+    if ( TIXML_SSCANF( str, IsPrefixHex(str) ? "%x" : "%u", value ) == 1 ) {

         return true;

     }

     return false;

@@ -657,7 +657,7 @@
 bool XMLUtil::ToInt64(const char* str, int64_t* value)

 {

 	long long v = 0;	// horrible syntax trick to make the compiler happy about %lld

-	if (TIXML_SSCANF(str, "%lld", &v) == 1) {

+	if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%llx" : "%lld", &v) == 1) {

 		*value = static_cast<int64_t>(v);

 		return true;

 	}

@@ -667,7 +667,7 @@
 

 bool XMLUtil::ToUnsigned64(const char* str, uint64_t* value) {

     unsigned long long v = 0;	// horrible syntax trick to make the compiler happy about %llu

-    if(TIXML_SSCANF(str, "%llu", &v) == 1) {

+    if(TIXML_SSCANF(str, IsPrefixHex(str) ? "%llx" : "%llu", &v) == 1) {

         *value = (uint64_t)v;

         return true;

     }

diff --git a/tinyxml2.h b/tinyxml2.h
index a432f7e..9646e85 100755
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -590,6 +590,13 @@
                || ch == '-';

     }

 

+    inline static bool IsPrefixHex( const char* p) {

+        while (p && *p != '\0' && !isdigit(*p)) {

+            ++p;

+        }

+        return *p == '0' && ( *(p + 1) == 'x' || *(p + 1) == 'X');

+    }

+

     inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX )  {

         if ( p == q ) {

             return true;

@@ -1478,7 +1485,7 @@
         XMLAttribute* a = FindOrCreateAttribute(name);

         a->SetAttribute(value);

     }

-    

+

     /// Sets the named attribute to value.

     void SetAttribute( const char* name, bool value )			{

         XMLAttribute* a = FindOrCreateAttribute( name );

diff --git a/xmltest.cpp b/xmltest.cpp
index 5a07547..a4c71a2 100755
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -1577,6 +1577,24 @@
         XMLTest("FloatText()) test", true, test6);

     }

 

+    {

+        //API:IntText(),UnsignedText(),Int64Text(), hex value test

+        const char* xml = "<point> <IntText>  -0x2020</IntText> <UnsignedText>0x2020</UnsignedText> \

+						   <Int64Text> +0x1234</Int64Text></point>";

+        XMLDocument doc;

+        doc.Parse(xml);

+

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

+        int test1 = pointElement->FirstChildElement("IntText")->IntText();

+        XMLTest("IntText() hex value test", -0x2020, test1);

+

+        unsigned test2 = pointElement->FirstChildElement("UnsignedText")->UnsignedText();

+        XMLTest("UnsignedText() hex value test", static_cast<unsigned>(0x2020), test2);

+

+        int64_t test3 = pointElement->FirstChildElement("Int64Text")->Int64Text();

+        XMLTest("Int64Text() hex value test", static_cast<int64_t>(+0x1234), test3);

+    }

+

 	{

 		//API:ShallowEqual() test

 		const char* xml = "<playlist id = 'playlist'>"