Re: [PATCH 5/6] virxml: Introduce parsing APIs that keep indentation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On a Tuesday in 2023, Michal Privoznik wrote:
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@xxxxxxxxxx>
---
src/util/virxml.c | 15 +++++++++++++--
src/util/virxml.h | 29 +++++++++++++++++++++++++----
2 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/src/util/virxml.c b/src/util/virxml.c
index 31685cddde..e94708448a 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -1129,14 +1129,16 @@ 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 |
+    int oldIndentTreeOutput = 0;
+    int parseFlags = XML_PARSE_NONET |
        XML_PARSE_NOWARNING;

    if (filename)
@@ -1155,12 +1157,21 @@ virXMLParseHelper(int domcode,
    pctxt->_private = &private;
    pctxt->sax->error = catchXMLError;

+    if (keepindent) {
+        parseFlags |= XML_PARSE_NOBLANKS;
+        xmlIndentTreeOutput = 1;
+    }
+
    if (filename) {
        xml = xmlCtxtReadFile(pctxt, filename, NULL, parseFlags);
    } else {
        xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, url, NULL, parseFlags);
    }

+    if (keepindent) {
+        xmlIndentTreeOutput = oldIndentTreeOutput;
+    }
+

Touching xmlIndentTreeOutput is not necessary.
1) it does not affect parsing, which is what we're doing here
2) xmlIndentTreeOutput = 1 is the default

All we need here is the XML_PARSE_NOBLANKS flag.

(Also, we did revert to the original value of xmlKeepBlanksDefaultValue
by calling xmlKeepBlanksDefault, but xmlIndentTreeOutput is always set
to 1 by xmlKeepBlanksDefault and never reset)

    if (!xml) {
        if (virGetLastErrorCode() == VIR_ERR_OK) {
            virGenericReportError(domcode, VIR_ERR_XML_ERROR,

Reviewed-by: Ján Tomko <jtomko@xxxxxxxxxx>

Jano

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux