parser xml FEATURE add attribute to unknown xml prefix message
... and rewrite LYDXML_LOG_NAMESPACE_ERR to function.
diff --git a/src/parser_xml.c b/src/parser_xml.c
index 435203e..34d6fdc 100644
--- a/src/parser_xml.c
+++ b/src/parser_xml.c
@@ -40,13 +40,6 @@
#include "validation.h"
#include "xml.h"
-#define LYDXML_LOG_NAMESPACE_ERR(XMLCTX, PREFIX, PREFIX_LEN) \
- if (PREFIX_LEN) { \
- LOGVAL(XMLCTX->ctx, LYVE_REFERENCE, "Unknown XML prefix \"%.*s\".", (int)PREFIX_LEN, PREFIX); \
- } else { \
- LOGVAL(XMLCTX->ctx, LYVE_REFERENCE, "Missing XML namespace."); \
- }
-
static LY_ERR lydxml_subtree_r(struct lyd_xml_ctx *lydctx, struct lyd_node *parent, struct lyd_node **first_p,
struct ly_set *parsed);
@@ -61,6 +54,30 @@
}
/**
+ * @brief Log namespace error.
+ *
+ * @param[in] xmlctx XML context
+ * @param[in] prefix XML prefix.
+ * @param[in] prefix_len XML prefix length.
+ * @param[in] attr_name Current XML attribute name.
+ * @param[in] attr_len Current XML attribute name length.
+ */
+static void
+lydxml_log_namespace_err(struct lyxml_ctx *xmlctx, const char *prefix, size_t prefix_len,
+ const char *attr_name, size_t attr_len)
+{
+ if (prefix_len && attr_len) {
+ LOGVAL(xmlctx->ctx, LYVE_REFERENCE, "Unknown XML prefix \"%.*s\" at attribute \"%.*s\".",
+ (int)prefix_len, prefix, (int)attr_len, attr_name);
+ } else if (prefix_len) {
+ LOGVAL(xmlctx->ctx, LYVE_REFERENCE, "Unknown XML prefix \"%.*s\".",
+ (int)prefix_len, prefix);
+ } else {
+ LOGVAL(xmlctx->ctx, LYVE_REFERENCE, "Missing XML namespace.");
+ }
+}
+
+/**
* @brief Parse and create XML metadata.
*
* @param[in] lydctx XML data parser context.
@@ -132,7 +149,7 @@
/* get namespace of the attribute to find its annotation definition */
ns = lyxml_ns_get(&xmlctx->ns, xmlctx->prefix, xmlctx->prefix_len);
if (!ns) {
- LYDXML_LOG_NAMESPACE_ERR(xmlctx, xmlctx->prefix, xmlctx->prefix_len);
+ lydxml_log_namespace_err(xmlctx, xmlctx->prefix, xmlctx->prefix_len, xmlctx->name, xmlctx->name_len);
ret = LY_ENOTFOUND;
goto cleanup;
}
@@ -223,7 +240,7 @@
if (prefix_len) {
ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
if (!ns) {
- LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+ lydxml_log_namespace_err(xmlctx, prefix, prefix_len, name, name_len);
ret = LY_EVALID;
goto cleanup;
}
@@ -545,7 +562,7 @@
if (lydctx->int_opts & LYD_INTOPT_ANY) {
goto unknown_module;
}
- LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+ lydxml_log_namespace_err(xmlctx, prefix, prefix_len, NULL, 0);
return LY_EVALID;
}
@@ -1179,7 +1196,7 @@
prefix_len = xmlctx->prefix_len;
ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
if (!ns) {
- LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+ lydxml_log_namespace_err(xmlctx, prefix, prefix_len, NULL, 0);
return LY_EVALID;
} else if (strcmp(ns->uri, uri)) {
/* different namespace */
@@ -1403,7 +1420,7 @@
prefix_len = xmlctx->prefix_len;
ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
if (!ns) {
- LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+ lydxml_log_namespace_err(xmlctx, prefix, prefix_len, NULL, 0);
return LY_EVALID;
}
diff --git a/tests/utests/data/test_parser_xml.c b/tests/utests/data/test_parser_xml.c
index 28c3770..d7203fa 100644
--- a/tests/utests/data/test_parser_xml.c
+++ b/tests/utests/data/test_parser_xml.c
@@ -361,7 +361,7 @@
" <c xmld:id=\"D\">1</c>\n"
"</a>\n",
LYD_XML, LYD_PARSE_OPAQ, LYD_VALIDATE_PRESENT, &tree));
- CHECK_LOG_CTX("Unknown XML prefix \"xmld\".", "/a", 3);
+ CHECK_LOG_CTX("Unknown XML prefix \"xmld\" at attribute \"id\".", "/a", 3);
}
static void