hi,
all sub item of spice graphics need to processed like spice channels, that is adding the following lines:
 if (!children) {
    virBufferAddLit(buf, ">\n");
    children = 1;
}

the following patch is generated base on git master.
-----------------------------------------------------------------------------------------
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b30acc8..e42db06 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8127,21 +8127,46 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
                               virDomainGraphicsSpiceChannelNameTypeToString(i),
                               virDomainGraphicsSpiceChannelModeTypeToString(mode));
         }
-        if (def->data.spice.image)
+        if (def->data.spice.image) {
             virBufferAsprintf(buf, "      <image compression='%s'/>\n",
                               virDomainGraphicsSpiceImageCompressionTypeToString(def->data.spice.image));
-        if (def->data.spice.jpeg)
+            if (!children) {
+                virBufferAddLit(buf, ">\n");
+                children = 1;
+            }
+        }
+        if (def->data.spice.jpeg) {
             virBufferAsprintf(buf, "      <jpeg compression='%s'/>\n",
                               virDomainGraphicsSpiceJpegCompressionTypeToString(def->data.spice.jpeg));
-        if (def->data.spice.zlib)
+            if (!children) {
+                virBufferAddLit(buf, ">\n");
+                children = 1;
+            }
+        }
+        if (def->data.spice.zlib) {
             virBufferAsprintf(buf, "      <zlib compression='%s'/>\n",
                               virDomainGraphicsSpiceZlibCompressionTypeToString(def->data.spice.zlib));
-        if (def->data.spice.playback)
+            if (!children) {
+                virBufferAddLit(buf, ">\n");
+                children = 1;
+            }
+        }
+        if (def->data.spice.playback) {
             virBufferAsprintf(buf, "      <playback compression='%s'/>\n",
                               virDomainGraphicsSpicePlaybackCompressionTypeToString(def->data.spice.playback));
-        if (def->data.spice.streaming)
+            if (!children) {
+                virBufferAddLit(buf, ">\n");
+                children = 1;
+            }
+        }
+        if (def->data.spice.streaming) {
             virBufferAsprintf(buf, "      <streaming mode='%s'/>\n",
                               virDomainGraphicsSpiceStreamingModeTypeToString(def->data.spice.streaming));
+            if (!children) {
+                virBufferAddLit(buf, ">\n");
+                children = 1;
+            }
+        }
     }
 
     if (children) {


--
Coolper Chen