* Copyright (c) 2002-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: srw.c,v 1.8 2003-03-03 19:57:37 adam Exp $
+ * $Id: srw.c,v 1.10 2003-03-20 21:15:00 adam Exp $
*/
#include <yaz/srw.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
+static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len)
+{
+ if (val)
+ {
+ xmlDocPtr doc = xmlParseMemory(val,len);
+ if (doc)
+ {
+ xmlNodePtr c = xmlNewChild(ptr, 0, elem, 0);
+ xmlNodePtr t = xmlDocGetRootElement(doc);
+ xmlAddChild(c, xmlCopyNode(t,1));
+ xmlFreeDoc(doc);
+ }
+ }
+}
+
static void add_xsd_string_n(xmlNodePtr ptr, const char *elem, char *val,
int len)
{
{
xmlNodePtr rptr;
(*recs)[i].recordSchema = 0;
+ (*recs)[i].recordPacking = Z_SRW_recordPacking_string;
(*recs)[i].recordData_buf = 0;
(*recs)[i].recordData_len = 0;
(*recs)[i].recordPosition = 0;
{
xmlNodePtr rptr = xmlNewChild(pptr, 0, "record", 0);
add_xsd_string(rptr, "recordSchema", (*recs)[i].recordSchema);
- add_xsd_string_n(rptr, "recordData", (*recs)[i].recordData_buf,
- (*recs)[i].recordData_len);
+ switch((*recs)[i].recordPacking)
+ {
+ case Z_SRW_recordPacking_string:
+ add_xsd_string_n(rptr, "recordData", (*recs)[i].recordData_buf,
+ (*recs)[i].recordData_len);
+ break;
+ case Z_SRW_recordPacking_XML:
+ add_XML_n(rptr, "recordXML", (*recs)[i].recordData_buf,
+ (*recs)[i].recordData_len);
+ break;
+ }
add_xsd_integer(rptr, "recordPosition", (*recs)[i].recordPosition);
}
}
&res->nextRecordPosition))
;
}
-
}
else
return -1;
if ((*p)->which == Z_SRW_searchRetrieve_request)
{
Z_SRW_searchRetrieveRequest *req = (*p)->u.request;
- xmlNsPtr ns_srw = xmlNewNs(pptr, ns, "zs");
- xmlNodePtr ptr = xmlNewChild(pptr, ns_srw,
+ xmlNodePtr ptr = xmlNewChild(pptr, 0,
"searchRetrieveRequest", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+
+ xmlSetNs(ptr, ns_srw);
+
switch(req->query_type)
{
case Z_SRW_query_type_cql:
else if ((*p)->which == Z_SRW_searchRetrieve_response)
{
Z_SRW_searchRetrieveResponse *res = (*p)->u.response;
- xmlNsPtr ns_srw = xmlNewNs(pptr, ns, "zs");
- xmlNodePtr ptr = xmlNewChild(pptr, ns_srw,
+ xmlNodePtr ptr = xmlNewChild(pptr, 0,
"searchRetrieveResponse", 0);
+ xmlNsPtr ns_srw = xmlNewNs(ptr, ns, "zs");
+ xmlSetNs(ptr, ns_srw);
add_xsd_integer(ptr, "numberOfRecords", res->numberOfRecords);
add_xsd_string(ptr, "resultSetId", res->resultSetId);
add_xsd_integer(ptr, "resultSetIdleTime", res->resultSetIdleTime);