diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e1eb67a..4f9833d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,11 +15,15 @@ * Changed XML creation and parse API for more coherency and closer YANG/XML integration. A new yang spec parameter has been added (default NULL) and functions have been removed and renamed. You may need to change the XML calls as follows. * xml_new(name, parent) --> xml_new(name, xn_parent, yspec) * xml_new_spec(name, parent, spec) --> xml_new(name, parent, spec) + * clicon_xml_parse(&xt, format, ...) --> xml_parse_va(&xt, yspec, format, ...) * clicon_xml_parse_file(fd, &xt, endtag) --> xml_parse_file(fd, endtag, yspec, &xt) * clicon_xml_parse_string(&str, &xt) --> xml_parse_string(str, yspec, &xt) - * xml_parse(str, xt) --> xml_parse_string(str, yspec, &xt) - * clicon_xml_parse(&xt, format, ...) --> xml_parse_va(&xt, yspec, format, ...) * clicon_xml_parse_str(str, &xt) --> xml_parse_string(str, yspec, &xt) + * xml_parse(str, xt) --> xml_parse_string(str, yspec, &xt) + * Backward compatibility is enabled by (will be removed in 3.5.0: + ``` + configure --with-xml-compat + ``` ## 3.3.3 (25 November 2017) diff --git a/apps/cli/cli_show.c b/apps/cli/cli_show.c index a30fb1d1..350966bd 100644 --- a/apps/cli/cli_show.c +++ b/apps/cli/cli_show.c @@ -209,8 +209,7 @@ expand_dbvar(void *h, else bodystr = xml_body(x); if (bodystr == NULL){ - clicon_err(OE_CFG, 0, "No xml body"); - goto done; + continue; /* no body, cornercase */ } /* detect duplicates */ for (k=0; k xml_new(name, parent, NULL) */ + +#define xml_new_spec(name, parent) xml_new(name, parent, NULL) +#define clicon_xml_parse(xt, fmt, ...) xml_parse_va(xt, NULL, fmt, __VA_ARGS__) +#define clicon_xml_parse_file(fd, xt, etag) xml_parse_file(fd, etag, NULL, xt) +#define clicon_xml_parse_string(strp, xt) xml_parse_string(*strp, NULL, xt) +#define clicon_xml_parse_str(str, xt) xml_parse_string(str, NULL, xt) +#define xml_parse(str, xt) xml_parse_string(str, NULL, &xt) +#endif + + #endif /* _CLIXON_XML_H */ diff --git a/lib/src/clixon_xml.c b/lib/src/clixon_xml.c index f77a11f3..f5434155 100644 --- a/lib/src/clixon_xml.c +++ b/lib/src/clixon_xml.c @@ -955,12 +955,14 @@ clicon_xml2file(FILE *f, cxobj *xc; int hasbody; int haselement; + char *val; name = xml_name(x); namespace = xml_namespace(x); switch(xml_type(x)){ case CX_BODY: - fprintf(f, "%s", xml_value(x)); + if ((val = xml_value(x)) != NULL) /* incomplete tree */ + fprintf(f, "%s", xml_value(x)); break; case CX_ATTR: fprintf(f, " "); @@ -1191,7 +1193,7 @@ xmltree2cbuf(cbuf *cb, * @see xml_parse_va */ static int -xml_parse(const char *str, +_xml_parse(const char *str, yang_spec *yspec, cxobj *xt) { @@ -1297,7 +1299,7 @@ xml_parse_file(int fd, if (*xt == NULL) if ((*xt = xml_new(XML_TOP_SYMBOL, NULL, NULL)) == NULL) goto done; - if (xml_parse(ptr, yspec, *xt) < 0) + if (_xml_parse(ptr, yspec, *xt) < 0) goto done; break; } @@ -1349,7 +1351,7 @@ xml_parse_string(const char *str, if (*xtop == NULL) if ((*xtop = xml_new(XML_TOP_SYMBOL, NULL, NULL)) == NULL) return -1; - return xml_parse(str, yspec, *xtop); + return _xml_parse(str, yspec, *xtop); } /*! Read XML from var-arg list and parse it into xml tree @@ -1397,7 +1399,7 @@ xml_parse_va(cxobj **xtop, if (*xtop == NULL) if ((*xtop = xml_new(XML_TOP_SYMBOL, NULL, NULL)) == NULL) goto done; - if (xml_parse(str, yspec, *xtop) < 0) + if (_xml_parse(str, yspec, *xtop) < 0) goto done; retval = 0; done: diff --git a/lib/src/clixon_xml_map.c b/lib/src/clixon_xml_map.c index 08746aed..7bda04b9 100644 --- a/lib/src/clixon_xml_map.c +++ b/lib/src/clixon_xml_map.c @@ -680,10 +680,8 @@ match_base_child(cxobj *x0, cvi = NULL; i = 0; while ((cvi = cvec_each(cvk, cvi)) != NULL) { keyname = cv_string_get(cvi); - if ((b1 = xml_find_body(x1c, keyname)) == NULL){ - clicon_err(OE_UNIX, errno, "key %s not found", keyname); - goto done; - } + if ((b1 = xml_find_body(x1c, keyname)) == NULL) + goto ok; /* not found */ b1vec[i++] = b1; } /* Iterate over x0 tree to (1) find a child that matches name