diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 8893be5682..4f45c90f54 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -2114,6 +2114,17 @@ xml_errorHandler(void *data, PgXmlErrorPtr error)
 	switch (domain)
 	{
 		case XML_FROM_PARSER:
+			/*
+			 * Suppress errors about not well-balanced elements because libxml2
+			 * already reports more specific errors in those cases.  So, this
+			 * error is redundant noise.  Also, libxml2 2.13 no longer reports
+			 * this error in every case.
+			 */
+			if (error->code == XML_ERR_NOT_WELL_BALANCED)
+				return;
+
+			/* fall through */
+
 		case XML_FROM_NONE:
 		case XML_FROM_MEMORY:
 		case XML_FROM_IO:
diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out
index 6500cff885..d6a51f9e38 100644
--- a/src/test/regress/expected/xml.out
+++ b/src/test/regress/expected/xml.out
@@ -254,17 +254,11 @@ ERROR:  invalid XML content
 DETAIL:  line 1: xmlParseEntityRef: no name
 <invalidentity>&</invalidentity>
                 ^
-line 1: chunk is not well balanced
-<invalidentity>&</invalidentity>
-                                ^
 SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>');
 ERROR:  invalid XML content
 DETAIL:  line 1: Entity 'idontexist' not defined
 <undefinedentity>&idontexist;</undefinedentity>
                              ^
-line 1: chunk is not well balanced
-<undefinedentity>&idontexist;</undefinedentity>
-                                               ^
 SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
          xmlparse          
 ---------------------------
@@ -283,9 +277,6 @@ DETAIL:  line 1: Entity 'idontexist' not defined
 <twoerrors>&idontexist;</unbalanced>
                        ^
 line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced
-<twoerrors>&idontexist;</unbalanced>
-                                    ^
-line 1: chunk is not well balanced
 <twoerrors>&idontexist;</unbalanced>
                                     ^
 SELECT xmlparse(content '<nosuchprefix:tag/>');
@@ -294,6 +285,19 @@ SELECT xmlparse(content '<nosuchprefix:tag/>');
  <nosuchprefix:tag/>
 (1 row)
 
+SELECT xmlparse(content '<unclosed>');
+ERROR:  invalid XML content
+DETAIL:  line 1: Premature end of data in tag unclosed line 1
+<unclosed>
+          ^
+SELECT xmlparse(content '<parent><child></parent></child>');
+ERROR:  invalid XML content
+DETAIL:  line 1: Opening and ending tag mismatch: child line 1 and parent
+<parent><child></parent></child>
+                        ^
+line 1: Opening and ending tag mismatch: parent line 1 and child
+<parent><child></parent></child>
+                                ^
 SELECT xmlparse(document '   ');
 ERROR:  invalid XML document
 DETAIL:  line 1: Start tag expected, '<' not found
@@ -352,6 +356,19 @@ SELECT xmlparse(document '<nosuchprefix:tag/>');
  <nosuchprefix:tag/>
 (1 row)
 
+SELECT xmlparse(document '<unclosed>');
+ERROR:  invalid XML document
+DETAIL:  line 1: Premature end of data in tag unclosed line 1
+<unclosed>
+          ^
+SELECT xmlparse(document '<parent><child></parent></child>');
+ERROR:  invalid XML document
+DETAIL:  line 1: Opening and ending tag mismatch: child line 1 and parent
+<parent><child></parent></child>
+                        ^
+line 1: Opening and ending tag mismatch: parent line 1 and child
+<parent><child></parent></child>
+                                ^
 SELECT xmlpi(name foo);
   xmlpi  
 ---------
diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql
index 953bac09e4..15ccbe1d35 100644
--- a/src/test/regress/sql/xml.sql
+++ b/src/test/regress/sql/xml.sql
@@ -77,6 +77,8 @@ SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
 SELECT xmlparse(content '<relativens xmlns=''relative''/>');
 SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>');
 SELECT xmlparse(content '<nosuchprefix:tag/>');
+SELECT xmlparse(content '<unclosed>');
+SELECT xmlparse(content '<parent><child></parent></child>');
 
 SELECT xmlparse(document '   ');
 SELECT xmlparse(document 'abc');
@@ -87,6 +89,8 @@ SELECT xmlparse(document '<invalidns xmlns=''&lt;''/>');
 SELECT xmlparse(document '<relativens xmlns=''relative''/>');
 SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>');
 SELECT xmlparse(document '<nosuchprefix:tag/>');
+SELECT xmlparse(document '<unclosed>');
+SELECT xmlparse(document '<parent><child></parent></child>');
 
 
 SELECT xmlpi(name foo);
