Modernize our parsing of XML data in CONTENT mode. The main goal of this patch is to get rid of our use of xmlKeepBlanksDefault, which libxml2 has deprecated. To do that, we want to use xmlParseInNodeContext instead of xmlParseBalancedChunkMemory, so that we can pass an options mask that includes XML_PARSE_NOBLANKS.
xmlParseInNodeContext wants an xmlNode rather than an xmlDoc as context. This gives us an opportunity for simplification though: we can make that node be a dummy root node for xml_parse's result document, and then attach the content node(s) as children of the root, essentially moving the data structure hack in xmltotext_with_options into xml_parse. The main benefit of this is that callers no longer need to free the content node list separately; freeing the document is sufficient. (There were error paths in xmltotext_with_options that I think would have leaked that list, though they could only be reached in OOM or similar conditions.) We also do some fooling with doc->encoding, to be bug-compatible with our previous behavior on as many libxml2 versions as practical. Some small discrepancies with previous behavior are known with older libxml2 versions. Therefore, it seems inadvisable to back-patch this, at least not before it's gotten a good deal of field experience. Author: Tom Lane <[email protected]> Fix-suggested-by: Andrew Dunstan <[email protected]> Reviewed-by: Rui Zhao <[email protected]> Discussion: https://postgr.es/m/zr2ppff1830b8772632fa23847d7482168fd2...@zr2ppff1830b877.chep278.prod.outlook.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/30d4a6daac8b61fd18dfe0d990d00943a170e48b Modified Files -------------- src/backend/utils/adt/xml.c | 156 ++++++++++++++++++++------------------ src/test/regress/expected/xml.out | 29 +++++++ src/test/regress/sql/xml.sql | 30 ++++++++ 3 files changed, 143 insertions(+), 72 deletions(-)
