#define CHECK_TYPE 0
-int yaz_match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o,
- char **val, int *len)
+int yaz_match_xsd_string_n_nmem(xmlNodePtr ptr, const char *elem, NMEM nmem,
+ char **val, int *len)
{
#if CHECK_TYPE
struct _xmlAttr *attr;
*val = "";
return 1;
}
- *val = odr_strdup(o, (const char *) ptr->content);
+ *val = nmem_strdup(nmem, (const char *) ptr->content);
if (len)
*len = xmlStrlen(ptr->content);
return 1;
}
+int yaz_match_xsd_string_n(xmlNodePtr ptr, const char *elem, ODR o,
+ char **val, int *len)
+{
+ return yaz_match_xsd_string_n_nmem(ptr, elem, o->mem, val, len);
+}
int yaz_match_xsd_string(xmlNodePtr ptr, const char *elem, ODR o, char **val)
{
#include <yaz/oid_db.h>
#if YAZ_HAVE_XML2
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-static int match_element(xmlNode *ptr, const char *elem)
-{
- if (ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST elem))
- {
- return 1;
- }
- return 0;
-}
-
-static int match_xsd_string_n(xmlNodePtr ptr, const char *elem, NMEM nmem,
- char **val, int *len)
-{
- if (!match_element(ptr, elem))
- return 0;
- ptr = ptr->children;
- if (!ptr || ptr->type != XML_TEXT_NODE)
- {
- *val = "";
- return 1;
- }
- *val = nmem_strdup(nmem, (const char *) ptr->content);
- if (len)
- *len = xmlStrlen(ptr->content);
- return 1;
-}
+#include "sru-p.h"
static int match_element_next(xmlNode **ptr, const char *elem, NMEM nmem,
char **val)
{
while (*ptr && (*ptr)->type != XML_ELEMENT_NODE)
(*ptr) = (*ptr)->next;
- if (*ptr && match_xsd_string_n(*ptr, elem, nmem, val, 0))
+ if (*ptr && yaz_match_xsd_string_n_nmem(*ptr, elem, nmem, val, 0))
{
*ptr = (*ptr)->next;
return 1;
while (*ptr && (*ptr)->type != XML_ELEMENT_NODE)
(*ptr) = (*ptr)->next;
*val = nmem_booldup(nmem, 0);
- if (*ptr && match_element(*ptr, elem))
+ if (*ptr && yaz_match_xsd_element(*ptr, elem))
{
struct _xmlAttr *attr = (*ptr)->properties;
ptr = ptr->next;
if (!ptr)
break;
- if (!match_element(ptr, "volume"))
+ if (!yaz_match_xsd_element(ptr, "volume"))
return 0;
ptr = ptr->next;
}
ptr = ptr->next;
if (!ptr)
break;
- if (!match_element(ptr, "volume"))
+ if (!yaz_match_xsd_element(ptr, "volume"))
return 0;
volume(ptr->children, (*volp) + i, nmem);
ptr = ptr->next;
ptr = ptr->next;
if (!ptr)
break;
- if (!match_element(ptr, "circulation"))
+ if (!yaz_match_xsd_element(ptr, "circulation"))
return 0;
ptr = ptr->next;
}
ptr = ptr->next;
if (!ptr)
break;
- if (!match_element(ptr, "circulation"))
+ if (!yaz_match_xsd_element(ptr, "circulation"))
return 0;
circulation(ptr->children, (*circp) + i, nmem);
ptr = ptr->next;
h->volumes = 0;
while (ptr && ptr->type != XML_ELEMENT_NODE)
ptr = ptr->next;
- if (match_element(ptr, "volumes"))
+ if (yaz_match_xsd_element(ptr, "volumes"))
{
volumes(ptr->children, &h->volumes, &h->num_volumes, nmem);
ptr = ptr->next;
h->circulationData = 0;
while (ptr && ptr->type != XML_ELEMENT_NODE)
ptr = ptr->next;
- if (match_element(ptr, "circulations"))
+ if (yaz_match_xsd_element(ptr, "circulations"))
{
circulations(ptr->children, &h->circulationData,
&h->num_circulationData, nmem);
if (!nmem)
nmem = yaz_marc_get_nmem(mt);
- if (!match_element(ptr, "opacRecord"))
+ if (!yaz_match_xsd_element(ptr, "opacRecord"))
return 0;
ptr = ptr->children;
while (ptr && ptr->type != XML_ELEMENT_NODE)
ptr = ptr->next;
- if (!match_element(ptr, "bibliographicRecord"))
+ if (!yaz_match_xsd_element(ptr, "bibliographicRecord"))
return 0;
if (!bibliographicRecord(mt, ptr->children, &ext, cd, nmem, syntax))
return 0;
ptr = ptr->next;
while (ptr && ptr->type != XML_ELEMENT_NODE)
ptr = ptr->next;
- if (!match_element(ptr, "holdings"))
+ if (!yaz_match_xsd_element(ptr, "holdings"))
return 0;
ptr = ptr->children;
ptr = ptr->next;
if (!ptr)
break;
- if (!match_element(ptr, "holding"))
+ if (!yaz_match_xsd_element(ptr, "holding"))
return 0;
ptr = ptr->next;
}
ptr = ptr->next;
if (!ptr)
break;
- if (!match_element(ptr, "holding"))
+ if (!yaz_match_xsd_element(ptr, "holding"))
return 0;
if (!holdingsRecord(ptr->children, opac->holdingsData + i, nmem))
return 0;