X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdump.c;h=662445ea00c339808c5c6222a4e2f8027ada089d;hb=7ef1b50f481cda83d012cc3d69d83f9313836f1f;hp=e65aed5715a83de9e1b9c1846d0c186887d901e3;hpb=790b38909763b433a994fdbdd277d1b01859728e;p=yaz-moved-to-github.git diff --git a/util/marcdump.c b/util/marcdump.c index e65aed5..662445e 100644 --- a/util/marcdump.c +++ b/util/marcdump.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2008 Index Data * See the file LICENSE for details. - * - * $Id: marcdump.c,v 1.53 2007-09-23 07:40:13 adam Exp $ */ #define _FILE_OFFSET_BITS 64 @@ -14,10 +12,20 @@ #if YAZ_HAVE_XML2 #include #include - #include #include +/* Libxml2 version < 2.6.15. xmlreader not reliable/present */ +#if LIBXML_VERSION < 20615 +#define USE_XMLREADER 0 +#else +#define USE_XMLREADER 1 +#endif + +#if USE_XMLREADER +#include +#endif + #endif #include @@ -99,28 +107,73 @@ static void marcdump_read_line(yaz_marc_t mt, const char *fname) #if YAZ_HAVE_XML2 static void marcdump_read_xml(yaz_marc_t mt, const char *fname) { - xmlNodePtr ptr; - xmlDocPtr doc = xmlParseFile(fname); - if (!doc) - return; + WRBUF wrbuf = wrbuf_alloc(); +#if USE_XMLREADER + xmlTextReaderPtr reader = xmlReaderForFile(fname, 0 /* encoding */, + 0 /* options */); - ptr = xmlDocGetRootElement(doc); - if (ptr) + if (reader) { - int r; - WRBUF wrbuf = wrbuf_alloc(); - r = yaz_marc_read_xml(mt, ptr); - if (r) - fprintf(stderr, "yaz_marc_read_xml failed\n"); - else + int ret; + while ((ret = xmlTextReaderRead(reader)) == 1) { - yaz_marc_write_mode(mt, wrbuf); - - fputs(wrbuf_cstr(wrbuf), stdout); + int type = xmlTextReaderNodeType(reader); + if (type == XML_READER_TYPE_ELEMENT) + { + const char *name = (const char *) + xmlTextReaderLocalName(reader); + if (!strcmp(name, "record")) + { + xmlNodePtr ptr = xmlTextReaderExpand(reader); + + int r = yaz_marc_read_xml(mt, ptr); + if (r) + fprintf(stderr, "yaz_marc_read_xml failed\n"); + else + { + yaz_marc_write_mode(mt, wrbuf); + + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_rewind(wrbuf); + } + } + } } - wrbuf_destroy(wrbuf); } - xmlFreeDoc(doc); +#else + xmlDocPtr doc = xmlParseFile(fname); + if (doc) + { + xmlNodePtr ptr = xmlDocGetRootElement(doc); + for (; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE) + { + if (!strcmp((const char *) ptr->name, "collection")) + { + ptr = ptr->children; + continue; + } + if (!strcmp((const char *) ptr->name, "record")) + { + int r = yaz_marc_read_xml(mt, ptr); + if (r) + fprintf(stderr, "yaz_marc_read_xml failed\n"); + else + { + yaz_marc_write_mode(mt, wrbuf); + + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_rewind(wrbuf); + } + } + } + } + xmlFreeDoc(doc); + } +#endif + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_destroy(wrbuf); } #endif @@ -152,6 +205,7 @@ static void dump(const char *fname, const char *from, const char *to, yaz_marc_iconv(mt, cd); } yaz_marc_xml(mt, output_format); + yaz_marc_enable_collection(mt); yaz_marc_write_using_libxml2(mt, write_using_libxml2); yaz_marc_debug(mt, verbose); @@ -278,7 +332,11 @@ static void dump(const char *fname, const char *from, const char *to, r = yaz_marc_decode_buf(mt, buf, -1, &result, &len_result); if (r > 0 && result) { - fwrite (result, len_result, 1, stdout); + if (fwrite(result, len_result, 1, stdout) != 1) + { + fprintf(stderr, "Write to stdout failed\n"); + break; + } } if (r > 0 && cfile) { @@ -307,6 +365,12 @@ static void dump(const char *fname, const char *from, const char *to, fprintf (cfile, "};\n"); fclose(inf); } + { + WRBUF wrbuf = wrbuf_alloc(); + yaz_marc_write_trailer(mt, wrbuf); + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_destroy(wrbuf); + } if (cd) yaz_iconv_close(cd); yaz_marc_destroy(mt);