virxml: Introduce parsing APIs that keep indentation

When parsing an XML it may be important to keep indentation to
produce a better looking result when formatting the XML back.
Just look at all those xmlKeepBlanksDefault() calls just before
virXMLParse() is called.

Anyway, as of libxml2 commit v2.12.0~108 xmlKeepBlanksDefault()
is deprecated. Therefore, introduce virXMLParse...WithIndent()
variants which would do exactly xmlKeepBlanksDefault() did but
with non-deprecated APIs.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Michal Privoznik 2023-11-21 10:39:58 +01:00
parent 1beb69df87
commit 69958ba310
2 changed files with 32 additions and 6 deletions

View File

@ -1129,14 +1129,15 @@ virXMLParseHelper(int domcode,
const char *rootelement,
xmlXPathContextPtr *ctxt,
const char *schemafile,
bool validate)
bool validate,
bool keepindent)
{
struct virParserData private;
g_autoptr(xmlParserCtxt) pctxt = NULL;
g_autoptr(xmlDoc) xml = NULL;
xmlNodePtr rootnode;
const char *docname;
const int parseFlags = XML_PARSE_NONET | XML_PARSE_NOWARNING;
int parseFlags = XML_PARSE_NONET | XML_PARSE_NOWARNING;
if (filename)
docname = filename;
@ -1154,6 +1155,10 @@ virXMLParseHelper(int domcode,
pctxt->_private = &private;
pctxt->sax->error = catchXMLError;
if (keepindent) {
parseFlags |= XML_PARSE_NOBLANKS;
}
if (filename) {
xml = xmlCtxtReadFile(pctxt, filename, NULL, parseFlags);
} else {

View File

@ -199,7 +199,8 @@ virXMLParseHelper(int domcode,
const char *rootelement,
xmlXPathContextPtr *ctxt,
const char *schemafile,
bool validate);
bool validate,
bool keepindent);
const char *
virXMLPickShellSafeComment(const char *str1,
@ -219,7 +220,17 @@ virXMLPickShellSafeComment(const char *str1,
* Return the parsed document object, or NULL on failure.
*/
#define virXMLParse(filename, xmlStr, url, rootelement, ctxt, schemafile, validate) \
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, rootelement, ctxt, schemafile, validate)
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, rootelement, ctxt, schemafile, validate, false)
/**
* virXMLParseWithIndent:
*
* Just like virXMLParse, except indentation is preserved. Should be used when
* facing an user provided XML which may be formatted back and keeping verbatim
* spacing is necessary (e.g. due to <metadata/>).
*/
#define virXMLParseWithIndent(filename, xmlStr, url, rootelement, ctxt, schemafile, validate) \
virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, rootelement, ctxt, schemafile, validate, true)
/**
* virXMLParseStringCtxt:
@ -233,7 +244,17 @@ virXMLPickShellSafeComment(const char *str1,
* Return the parsed document object, or NULL on failure.
*/
#define virXMLParseStringCtxt(xmlStr, url, pctxt) \
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, pctxt, NULL, false)
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, pctxt, NULL, false, false)
/**
* virXMLParseStringCtxtWithIndent:
*
* Just like virXMLParseStringCtxt, except indentation is preserved. Should be
* used when facing an user provided XML which may be formatted back and
* keeping verbatim spacing is necessary (e.g. due to <metadata/>).
*/
#define virXMLParseStringCtxtWithIndent(xmlStr, url, pctxt) \
virXMLParseHelper(VIR_FROM_THIS, NULL, xmlStr, url, NULL, pctxt, NULL, false, true)
/**
* virXMLParseFileCtxt:
@ -246,7 +267,7 @@ virXMLPickShellSafeComment(const char *str1,
* Return the parsed document object, or NULL on failure.
*/
#define virXMLParseFileCtxt(filename, pctxt) \
virXMLParseHelper(VIR_FROM_THIS, filename, NULL, NULL, NULL, pctxt, NULL, false)
virXMLParseHelper(VIR_FROM_THIS, filename, NULL, NULL, NULL, pctxt, NULL, false, false)
int
virXMLSaveFile(const char *path,