18 #include <libxml/parser.h>
19 #include <libxml/tree.h>
24 static void add_XML_n(xmlNodePtr ptr,
const char *elem,
char *val,
int len,
29 xmlDocPtr doc = xmlParseMemory(val,len);
32 xmlNodePtr c = xmlNewChild(ptr, ns_ptr, BAD_CAST elem, 0);
33 xmlNodePtr t = xmlDocGetRootElement(doc);
34 xmlAddChild(c, xmlCopyNode(t,1));
45 xmlNodePtr c = xmlNewChild(ptr, 0, BAD_CAST elem, 0);
46 xmlNodePtr t = xmlNewTextLen(BAD_CAST val, len);
58 xmlNodePtr c = xmlNewChild(ptr, ns_ptr, BAD_CAST elem, 0);
59 xmlNodePtr t = xmlNewText(BAD_CAST val);
78 xmlNewTextChild(ptr, 0, BAD_CAST elem, BAD_CAST str);
84 if (ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST elem))
97 struct _xmlAttr *attr;
102 for (attr = ptr->properties; attr; attr = attr->next)
103 if (!strcmp(attr->name,
"type") &&
104 attr->children && attr->children->type == XML_TEXT_NODE)
106 const char *t = strchr(attr->children->content,
':');
110 t = attr->children->content;
111 if (!strcmp(t,
"string"))
118 if (!ptr || ptr->type != XML_TEXT_NODE)
123 *val =
odr_strdup(o, (
const char *) ptr->content);
125 *len = xmlStrlen(ptr->content);
137 char **val,
int *len,
int fixup_root)
140 int no_root_nodes = 0;
145 buf = xmlBufferCreate();
152 for (ptr = ptr->children; ptr; ptr = ptr->next)
154 if (ptr->type == XML_ELEMENT_NODE)
157 xmlNode *tmp = xmlCopyNode(ptr, 1);
159 xmlNodeDump(buf, tmp->doc, tmp, 0, 0);
165 if (no_root_nodes != 1 && fixup_root)
168 xmlBufferAddHead(buf, (
const xmlChar *)
"<yaz_record>", -1);
169 xmlBufferAdd(buf, (
const xmlChar *)
"</yaz_record>", -1);
172 memcpy(*val, buf->content, buf->use);
173 (*val)[buf->use] =
'\0';
184 char **val,
int *len)
193 struct _xmlAttr *attr;
198 for (attr = ptr->properties; attr; attr = attr->next)
199 if (!strcmp(attr->name,
"type") &&
200 attr->children && attr->children->type == XML_TEXT_NODE)
202 const char *t = strchr(attr->children->content,
':');
206 t = attr->children->content;
207 if (!strcmp(t,
"integer"))
214 if (!ptr || ptr->type != XML_TEXT_NODE)
225 if (!strcmp(input_ver,
"1.1"))
232 void *client_data,
const char *ns)
250 for (ptr = pptr->children; ptr; ptr = ptr->next)
266 xmlNode *p = ptr->children;
267 for (; p; p = p->next)
268 if (p->type == XML_ELEMENT_NODE)
273 ptr,
"recordData", o,
280 ptr,
"recordData", o,
302 xmlNodePtr ptr = pptr;
328 if ((*extra)->recordIdentifier)
330 (*extra)->recordIdentifier);
331 if ((*extra)->extraRecordData_buf)
333 (*extra)->extraRecordData_buf,
334 (*extra)->extraRecordData_len, 0);
342 int *num,
void *client_data,
const char *ns)
349 for (ptr = pptr->children; ptr; ptr = ptr->next)
351 if (ptr->type == XML_ELEMENT_NODE &&
352 !xmlStrcmp(ptr->name, BAD_CAST
"record"))
359 for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next)
361 if (ptr->type == XML_ELEMENT_NODE &&
362 !xmlStrcmp(ptr->name, BAD_CAST
"record"))
372 for (i = 0; i < *num; i++)
374 xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST
"record",
384 void *client_data,
const char *ns)
391 for (ptr = pptr->children; ptr; ptr = ptr->next)
403 xmlNodePtr ptr = pptr;
412 int *num,
void *client_data,
const char *ns)
419 for (ptr = pptr->children; ptr; ptr = ptr->next)
421 if (ptr->type == XML_ELEMENT_NODE &&
422 !xmlStrcmp(ptr->name, BAD_CAST
"recordVersion"))
428 for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next)
430 if (ptr->type == XML_ELEMENT_NODE &&
431 !xmlStrcmp(ptr->name, BAD_CAST
"recordVersion"))
441 for (i = 0; i < *num; i++)
443 xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST
"version",
458 node,
"facetvalue",
"est_representation");
464 for (child = node->children; child ; child = child->next)
466 if (child->type == XML_TEXT_NODE)
467 wrbuf_puts(wrbuf, (
const char *) child->content);
486 for (node = ptr->children; node; node = node->next) {
492 for (node = ptr->children; node; node = node->next)
510 for (ptr = root->children; ptr; ptr = ptr->next)
517 for (node = ptr->children; node; node= node->next)
519 if (node->type == XML_ELEMENT_NODE)
524 for (node = ptr->children; node; node= node->next)
534 *facetList = facet_list;
545 void *client_data,
const char *ns)
550 for (ptr = pptr; ptr; ptr = ptr->next)
552 if (ptr->type == XML_ELEMENT_NODE &&
553 !xmlStrcmp(ptr->name, BAD_CAST
"diagnostic"))
559 for (i = 0; i < *num; i++)
562 (*recs)[i].details = 0;
563 (*recs)[i].message = 0;
565 for (i = 0, ptr = pptr; ptr; ptr = ptr->next)
567 if (ptr->type == XML_ELEMENT_NODE &&
568 !xmlStrcmp(ptr->name, BAD_CAST
"diagnostic"))
572 (*recs)[i].details = 0;
573 (*recs)[i].message = 0;
574 for (rptr = ptr->children; rptr; rptr = rptr->next)
580 &(*recs)[i].details))
596 xmlDocPtr doc = xmlParseMemory(buf, len);
599 xmlNodePtr ptr = xmlDocGetRootElement(doc);
600 while (ptr && ptr->type != XML_ELEMENT_NODE)
603 && !xmlStrcmp(ptr->ns->href,
604 BAD_CAST
"http://www.loc.gov/zing/srw/diagnostic/"))
614 int *num,
void *client_data,
const char *ns)
625 for (i = 0; i < *num; i++)
627 const char *std_diag =
"info:srw/diagnostic/1/";
628 const char *ucp_diag =
"info:srw/diagnostic/12/";
629 xmlNodePtr rptr = xmlNewChild(pptr, ns_diag,
630 BAD_CAST
"diagnostic", 0);
632 if ((*recs)[i].message)
634 else if ((*recs)[i].uri )
636 if (!strncmp((*recs)[i].uri, std_diag, strlen(std_diag)))
638 int no = atoi((*recs)[i].uri + strlen(std_diag));
643 else if (!strncmp((*recs)[i].uri, ucp_diag, strlen(ucp_diag)))
645 int no = atoi((*recs)[i].uri + strlen(ucp_diag));
658 void *client_data,
const char *ns)
667 for (ptr = pptr->children; ptr; ptr = ptr->next)
683 xmlNodePtr ptr = pptr;
693 int *num,
void *client_data,
const char *ns)
700 for (ptr = pptr->children; ptr; ptr = ptr->next)
702 if (ptr->type == XML_ELEMENT_NODE &&
703 !xmlStrcmp(ptr->name, BAD_CAST
"term"))
709 for (i = 0, ptr = pptr->children; ptr; ptr = ptr->next, i++)
711 if (ptr->type == XML_ELEMENT_NODE &&
712 !xmlStrcmp(ptr->name, BAD_CAST
"term"))
719 for (i = 0; i < *num; i++)
721 xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST
"term", 0);
729 void *client_data,
const char *ns)
731 xmlNodePtr pptr = (xmlNodePtr) vptr;
735 xmlNodePtr method = pptr->children;
738 while (method && method->type == XML_TEXT_NODE)
739 method = method->next;
743 if (method->type != XML_ELEMENT_NODE)
748 if (!xmlStrcmp(method->name, BAD_CAST
"searchRetrieveRequest"))
750 xmlNodePtr ptr = method->children;
769 for (; ptr; ptr = ptr->next)
816 else if (!xmlStrcmp(method->name, BAD_CAST
"searchRetrieveResponse"))
818 xmlNodePtr ptr = method->children;
836 for (; ptr; ptr = ptr->next)
842 &(*p)->extraResponseData_buf,
843 &(*p)->extraResponseData_len))
869 else if (!xmlStrcmp(method->name, BAD_CAST
"explainRequest"))
872 xmlNodePtr ptr = method->children;
880 for (; ptr; ptr = ptr->next)
886 &(*p)->extraResponseData_buf,
887 &(*p)->extraResponseData_len))
899 else if (!xmlStrcmp(method->name, BAD_CAST
"explainResponse"))
902 xmlNodePtr ptr = method->children;
914 for (; ptr; ptr = ptr->next)
920 &(*p)->extraResponseData_buf,
921 &(*p)->extraResponseData_len))
933 else if (!xmlStrcmp(method->name, BAD_CAST
"scanRequest"))
936 xmlNodePtr ptr = method->children;
948 for (; ptr; ptr = ptr->next)
954 &(*p)->extraResponseData_buf,
955 &(*p)->extraResponseData_len))
978 else if (!xmlStrcmp(method->name, BAD_CAST
"scanResponse"))
981 xmlNodePtr ptr = method->children;
991 for (; ptr; ptr = ptr->next)
997 &(*p)->extraResponseData_buf,
998 &(*p)->extraResponseData_len))
1017 (*p)->srw_version = neg_version;
1028 ptr = xmlNewChild(pptr, 0, BAD_CAST
"searchRetrieveRequest", 0);
1029 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1030 xmlSetNs(ptr, ns_srw);
1032 if ((*p)->srw_version)
1069 ptr = xmlNewChild(pptr, 0, BAD_CAST
"searchRetrieveResponse", 0);
1070 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1071 xmlSetNs(ptr, ns_srw);
1073 if ((*p)->srw_version)
1080 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"records", 0);
1089 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"diagnostics",
1098 ptr = xmlNewChild(pptr, 0, BAD_CAST
"explainRequest", 0);
1099 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1100 xmlSetNs(ptr, ns_srw);
1110 ptr = xmlNewChild(pptr, 0, BAD_CAST
"explainResponse", 0);
1111 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1112 xmlSetNs(ptr, ns_srw);
1117 xmlNodePtr ptr1 = xmlNewChild(ptr, 0, BAD_CAST
"record", 0);
1123 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"diagnostics",
1132 ptr = xmlNewChild(pptr, 0, BAD_CAST
"scanRequest", 0);
1133 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1134 xmlSetNs(ptr, ns_srw);
1154 ptr = xmlNewChild(pptr, 0, BAD_CAST
"scanResponse", 0);
1155 ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST
"zs");
1156 xmlSetNs(ptr, ns_srw);
1162 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"terms", 0);
1168 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"diagnostics",
1176 if (ptr && (*p)->extraResponseData_len)
1178 (*p)->extraResponseData_buf,
1179 (*p)->extraResponseData_len, ns_srw);
1187 void *client_data,
const char *ns_ucp_str)
1189 xmlNodePtr pptr = (xmlNodePtr) vptr;
1194 xmlNodePtr method = pptr->children;
1196 while (method && method->type == XML_TEXT_NODE)
1197 method = method->next;
1201 if (method->type != XML_ELEMENT_NODE)
1206 if (!xmlStrcmp(method->name, BAD_CAST
"updateRequest"))
1208 xmlNodePtr ptr = method->children;
1226 for (; ptr; ptr = ptr->next)
1229 &(*p)->srw_version))
1235 if (!strcmp(oper,
"info:srw/action/1/delete"))
1237 else if (!strcmp(oper,
"info:srw/action/1/replace" ))
1239 else if (!strcmp(oper,
"info:srw/action/1/create"))
1254 client_data, ns_ucp_str);
1263 else if (!xmlStrcmp(method->name, BAD_CAST
"updateResponse"))
1265 xmlNodePtr ptr = method->children;
1283 for (; ptr; ptr = ptr->next)
1286 &(*p)->srw_version))
1297 client_data, ns_ucp_str);
1302 client_data, ns_ucp_str);
1307 client_data, ns_ucp_str);
1310 else if (!xmlStrcmp(method->name, BAD_CAST
"explainUpdateRequest"))
1313 else if (!xmlStrcmp(method->name, BAD_CAST
"explainUpdateResponse"))
1325 xmlNsPtr ns_ucp, ns_srw;
1330 xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST
"updateRequest", 0);
1331 ns_ucp = xmlNewNs(ptr, BAD_CAST ns_ucp_str, BAD_CAST
"zu");
1332 xmlSetNs(ptr, ns_ucp);
1333 ns_srw = xmlNewNs(ptr, BAD_CAST ns_srw_str, BAD_CAST
"zs");
1341 client_data, ns_ucp_str);
1344 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"record", 0);
1345 xmlSetNs(rptr, ns_srw);
1347 client_data, ns_ucp_str);
1361 xmlNodePtr ptr = xmlNewChild(pptr, 0, (xmlChar *)
1362 "updateResponse", 0);
1363 ns_ucp = xmlNewNs(ptr, BAD_CAST ns_ucp_str, BAD_CAST
"zu");
1364 xmlSetNs(ptr, ns_ucp);
1365 ns_srw = xmlNewNs(ptr, BAD_CAST ns_srw_str, BAD_CAST
"zs");
1373 client_data, ns_ucp_str);
1376 xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST
"record", 0);
1377 xmlSetNs(rptr, ns_srw);
1379 client_data, ns_ucp_str);
1387 xmlNodePtr rptr = xmlNewChild(ptr, ns_diag, BAD_CAST
"diagnostics", 0);