parser xml BUGFIX full xml context backup

... including opened elements and namespaces.
Fixes cesnet/netopeer2#930
diff --git a/src/parser_xml.c b/src/parser_xml.c
index 570d6b3..a827ab7 100644
--- a/src/parser_xml.c
+++ b/src/parser_xml.c
@@ -330,10 +330,7 @@
 lydxml_data_check_opaq(struct lyd_xml_ctx *lydctx, const struct lysc_node **snode)
 {
     LY_ERR ret = LY_SUCCESS;
-    enum LYXML_PARSER_STATUS prev_status;
-    const char *prev_current, *pname, *pprefix;
-    size_t pprefix_len, pname_len;
-    struct lyxml_ctx *xmlctx = lydctx->xmlctx;
+    struct lyxml_ctx *xmlctx = lydctx->xmlctx, pxmlctx;
 
     if (!(lydctx->parse_opts & LYD_PARSE_OPAQ)) {
         /* only checks specific to opaque nodes */
@@ -345,17 +342,10 @@
         return LY_SUCCESS;
     }
 
+    assert(xmlctx->elements.count);
+
     /* backup parser */
-    prev_status = xmlctx->status;
-    pprefix = xmlctx->prefix;
-    pprefix_len = xmlctx->prefix_len;
-    pname = xmlctx->name;
-    pname_len = xmlctx->name_len;
-    prev_current = xmlctx->in->current;
-    if ((xmlctx->status == LYXML_ELEM_CONTENT) && xmlctx->dynamic) {
-        /* it was backed up, do not free */
-        xmlctx->dynamic = 0;
-    }
+    LY_CHECK_RET(lyxml_ctx_backup(xmlctx, &pxmlctx));
 
     /* skip attributes */
     while (xmlctx->status == LYXML_ATTRIBUTE) {
@@ -386,16 +376,7 @@
 
 restore:
     /* restore parser */
-    if (xmlctx->dynamic) {
-        free((char *)xmlctx->value);
-    }
-    xmlctx->status = prev_status;
-    xmlctx->prefix = pprefix;
-    xmlctx->prefix_len = pprefix_len;
-    xmlctx->name = pname;
-    xmlctx->name_len = pname_len;
-    xmlctx->in->current = prev_current;
-
+    lyxml_ctx_restore(xmlctx, &pxmlctx);
     return ret;
 }
 
@@ -537,6 +518,10 @@
             LY_CHECK_GOTO(ret, error);
         }
 
+        /* get NS again, it may have been backed up and restored */
+        ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
+        assert(ns);
+
         /* create node */
         ret = lyd_create_opaq(ctx, name, name_len, prefix, prefix_len, ns->uri, strlen(ns->uri), xmlctx->value,
                 xmlctx->value_len, &xmlctx->dynamic, format, val_prefix_data, LYD_HINT_DATA, &node);