diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index cefd22d..e007294 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -645,6 +645,9 @@ XMLNode::~XMLNode()
const char* XMLNode::Value() const
{
+ // Catch an edge case: XMLDocuments don't have a a Value. Carefully return nullptr.
+ if ( this->ToDocument() )
+ return 0;
return _value.GetStr();
}
diff --git a/tinyxml2.h b/tinyxml2.h
index d0620cc..70a9851 100755
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -122,9 +122,9 @@ inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... )
/* Versioning, past 1.0.14:
http://semver.org/
*/
-static const int TIXML2_MAJOR_VERSION = 3;
-static const int TIXML2_MINOR_VERSION = 0;
-static const int TIXML2_PATCH_VERSION = 0;
+static const int TIXML2_MAJOR_VERSION = 3;
+static const int TIXML2_MINOR_VERSION = 0;
+static const int TIXML2_PATCH_VERSION = 0;
namespace tinyxml2
{
@@ -708,7 +708,7 @@ public:
/** The meaning of 'value' changes for the specific type.
@verbatim
- Document: empty
+ Document: empty (NULL is returned, not an empty string)
Element: name of the element
Comment: the comment text
Unknown: the tag contents
diff --git a/xmltest.cpp b/xmltest.cpp
index f3fa7b2..5e0eb3a 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -30,7 +30,13 @@ int gFail = 0;
bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true, bool extraNL=false )
{
- bool pass = !strcmp( expected, found );
+ bool pass;
+ if ( !expected && !found )
+ pass = true;
+ else if ( !expected || !found )
+ pass = false;
+ else
+ pass = !strcmp( expected, found );
if ( pass )
printf ("[pass]");
else
@@ -1462,24 +1468,37 @@ int main( int argc, const char ** argv )
{
// Check that declarations are parsed only as the FirstChild
- const char* xml0 = ""
- " "
- "";
- const char* xml1 = ""
- " "
- "";
- const char* xml2 = ""
- "";
- XMLDocument doc;
- doc.Parse(xml0);
- XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false);
- doc.Parse(xml1);
- XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);
- doc.Parse(xml2);
- XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);
+ const char* xml0 = ""
+ " "
+ "";
+ const char* xml1 = ""
+ " "
+ "";
+ const char* xml2 = ""
+ "";
+ XMLDocument doc;
+ doc.Parse(xml0);
+ XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false);
+ doc.Parse(xml1);
+ XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);
+ doc.Parse(xml2);
+ XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);
}
- // ----------- Performance tracking --------------
+ {
+ // No matter - before or after successfully parsing a text -
+ // calling XMLDocument::Value() causes an assert in debug.
+ const char* validXml = ""
+ ""
+ "";
+ XMLDocument* doc = new XMLDocument();
+ XMLTest( "XMLDocument::Value() returns null?", NULL, doc->Value() );
+ doc->Parse( validXml );
+ XMLTest( "XMLDocument::Value() returns null?", NULL, doc->Value() );
+ delete doc;
+ }
+
+ // ----------- Performance tracking --------------
{
#if defined( _MSC_VER )
__int64 start, end, freq;