Keep indentation control fully inside the XMLPrinter. You'll have to subclass it to override its standard behaviour by overwriting CompactMode().
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 5117986..beaeeb8 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -1323,7 +1323,6 @@
 	else if( !FirstChild() ) {

 		theBoolElem = GetDocument()->NewElement( inBool ? "true" : "false" );

 		InsertFirstChild( theBoolElem );

-		SetForceCompactMode(true);

 	}

 }

 

@@ -2190,7 +2189,9 @@
 

 bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute )

 {

-    OpenElement( element.Name(), _compactMode ? true : element.Parent()->GetForceCompactMode() );

+	const XMLElement*	parentElem = element.Parent()->ToElement();

+	bool		compactMode = parentElem ? CompactMode(*parentElem) : _compactMode;

+    OpenElement( element.Name(), compactMode );

     while ( attribute ) {

         PushAttribute( attribute->Name(), attribute->Value() );

         attribute = attribute->Next();

@@ -2201,7 +2202,7 @@
 

 bool XMLPrinter::VisitExit( const XMLElement& element )

 {

-    CloseElement( _compactMode ? true : element.GetForceCompactMode() );

+    CloseElement( CompactMode(element) );

     return true;

 }

 

diff --git a/tinyxml2.h b/tinyxml2.h
index 431088d..a584010 100755
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -822,9 +822,6 @@
     // internal

     virtual char* ParseDeep( char*, StrPair* );

 	

-	bool	GetForceCompactMode() const		{ if( _forceCompactMode || !Parent() ) return _forceCompactMode; return Parent()->GetForceCompactMode(); };

-	void	SetForceCompactMode( bool b )	{ _forceCompactMode = b; };

-

 protected:

     XMLNode( XMLDocument* );

     virtual ~XMLNode();

@@ -2079,6 +2076,8 @@
     }

 

 protected:

+	virtual bool CompactMode( const XMLElement& elem )	{ return _compactMode; };

+

     void SealElement();

     bool _elementJustOpened;

     DynArray< const char*, 10 > _stack;